摘要:示例你是誰啊,大幾都老梁做做沒結(jié)果你是誰啊,大幾都老梁做做沒對反斜杠進行轉(zhuǎn)換結(jié)果你是誰啊,大幾都老梁對斜杠進行過濾入庫時進行檢測攻擊。打印你是誰啊,大幾都老梁做做沒編碼雙引號和單引號。
htmlspecialchars() 函數(shù)把預定義的字符轉(zhuǎn)換為 HTML 實體。
預定義的字符是:
& (和號)成為 &
" (雙引號)成為 "
" (單引號)成為 "
< (小于)成為 <
> (大于)成為 >
注意:這個函數(shù)不能對斜杠/,反斜杠做處理。
示例:
$content = "你是/誰啊,大幾都"老梁"做做&>women沒"; $content = htmlspecialchars($content); // 結(jié)果: 你是/誰啊,大幾都"老梁"做做&>women沒 // 對反斜杠進行轉(zhuǎn)換 $content = preg_replace("http://", "\", $content); // 結(jié)果:你是/誰啊,大幾\都"老梁 // 對斜杠進行過濾,入庫時進行XSS檢測攻擊。 $content = preg_replace("http:///", "/", $content);一、HTML 實體
在 HTML 中,某些字符是預留的。
在 HTML 中不能使用小于號(<)和大于號(>),這是因為瀏覽器會誤認為它們是標簽。
如果希望正確地顯示預留字符,我們必須在 HTML 源代碼中使用字符實體(character entities)。
字符實體類似這樣:
&entity_name;或者entity_number;
如需顯示小于號,我們必須這樣寫:< 或 <
提示:使用實體名而不是數(shù)字的好處是,名稱易于記憶。不過壞處是,瀏覽器也許并不支持所有實體名稱(對實體數(shù)字的支持卻很好)。
二、PHP htmlspecialchars() 函數(shù)htmlspecialchars(string,flags,character-set,double_encode)
flags 可選。規(guī)定如何處理引號、無效的編碼以及使用哪種文檔類型。
可用的引號類型:
ENT_COMPAT - 默認。僅編碼雙引號。
ENT_QUOTES - 編碼雙引號和單引號。
ENT_NOQUOTES - 不編碼任何引號。
character-set:
UTF-8 - 默認。ASCII 兼容多字節(jié)的 8 位 Unicode
POCO 的后端為GBK,所以用這個函數(shù)的時候,盡量使用編碼,而默認的編碼為UTF-8
GB2312 - 簡體中文,國家標準字符集
double_encode 可選。布爾值,規(guī)定了是否編碼已存在的 HTML 實體。
TRUE - 默認。將對每個實體進行轉(zhuǎn)換。
FALSE - 不會對已存在的 HTML 實體進行編碼。
示例:
$content = "women"s life" . "你是/誰啊,大幾都"老梁"做做&>women沒"; // 如果使用默認的參數(shù),則不會對單引號進行轉(zhuǎn)換。 $new_str = htmlspecialchars($content ); 打印: women"s life你是/誰啊,大幾都"老梁"做做&>women沒 // ENT_QUOTES 編碼雙引號和單引號。 $new_str = htmlspecialchars($content, ENT_QUOTES); women's life你是/誰啊,大幾都"老梁"做做&>women沒三、htmlspecialchars_decode解碼
htmlspecialchars_decode(string,flags)
string 必需。規(guī)定要解碼的字符串。
flags 可選。規(guī)定如何處理引號以及使用哪種文檔類型。
可用的引號類型:
ENT_COMPAT - 默認。僅解碼雙引號。
ENT_QUOTES - 解碼雙引號和單引號。
ENT_NOQUOTES - 不解碼任何引號。
測試:
解碼: $str = ‘women's life你是/誰啊,大幾都"老梁"做做&>women沒’; // 只解碼雙引號 $new_str = htmlspecialchars_decode($new_str); dump($new_str); 打?。?women's life你是/誰啊,大幾都"老梁"做"做&>women沒 // 解碼雙引號和單引號。 $content = "women"s life" . "你是/誰啊,大幾都"老梁"做"做&>women沒"; $new_str = htmlspecialchars($content, ENT_QUOTES, gb2312, true); $new_str = htmlspecialchars_decode($new_str, ENT_QUOTES); print_r($new_str); 打印: women"s life你是/誰啊,大幾都"老梁"做"做&>women沒四、函數(shù)封裝
將上邊的字符串預定義轉(zhuǎn)為實體封裝為一個方法,以后可以直接調(diào)用:
$str = "women"s life" . "你是/誰啊,大幾都"老梁"做做&>women沒"; // 1.將常用的預定義字符轉(zhuǎn)為實體 $new_str = htmlspecialchars($str, ENT_QUOTES, gb2312, true); // 2.替換反斜杠 $new_str = preg_replace("http://", "\", $new_str); // 3.替換斜杠 $content = preg_replace("http:///", "/", $content); // 打印結(jié)果: women's life你是/誰啊,大幾\都"老梁"做做&>women沒