?htmlspecialchars()函數的功能如下:
?
htmlspecialchars() 函數把預定義的字符轉換為 HTML 實體。
預定義的字符是:
- & (和號)成為 &
- " (雙引號)成為 "
- ' (單引號)成為 '
- < (小于)成為 <
- > (大于)成為 >
它的語法如下:
htmlspecialchars(string,flags,character-set,double_encode)
? ? 其中第二個參數flags需要重要注意,很多開發者就是因為沒有注意到這個參數導致使用htmlspecialchars()函數過濾XSS時被繞過。因為flags參數對于引號的編碼如下:
?
可用的引號類型:
- ENT_COMPAT - 默認。僅編碼雙引號。
- ENT_QUOTES - 編碼雙引號和單引號。
- ENT_NOQUOTES - 不編碼任何引號。
默認是只編碼雙引號的!默認只編碼雙引號!默認只編碼雙引號……重要的事情說三遍!!!
于是看下面的代碼:
輕松繞過:
加上ENT_QUOTES參數:
? ? ? ? 發現無法繞過了:
查看源代碼:
單引號已經被轉換了。