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