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