htmlspecialchars() 函數過濾XSS的問題

 htmlspecialchars()函數的功能以下:php

 

htmlspecialchars() 函數把預約義的字符轉換爲 HTML 實體。html

預約義的字符是:函數

  • & (和號)成爲 &
  • " (雙引號)成爲 "
  • ' (單引號)成爲 '
  • < (小於)成爲 <
  • > (大於)成爲 >
 
它的語法以下:
htmlspecialchars(string,flags,character-set,double_encode)

    其中第二個參數flags須要重要注意,不少開發者就是由於沒有注意到這個參數致使使用htmlspecialchars()函數過濾XSS時被繞過。由於flags參數對於引號的編碼以下:編碼

 

可用的引號類型:code

  • ENT_COMPAT - 默認。僅編碼雙引號。
  • ENT_QUOTES - 編碼雙引號和單引號。
  • ENT_NOQUOTES - 不編碼任何引號。
默認是隻編碼雙引號的!默認只編碼雙引號!默認只編碼雙引號……重要的事情說三遍!!!
 
        因而看下面的代碼:
  
<?php   
    $name = $_GET["name"];  
    $name = htmlspecialchars($name);  
?>  
  
<input type='text' value='<?php echo $name?>'>  

  

        輕鬆繞過:
 
 
    加上ENT_QUOTES參數:
  
<?php   
    $name = $_GET["name"];  
    $name = htmlspecialchars($name, ENT_QUOTES);  
?>  
  
<input type='text' value='<?php echo $name?>'>  

  

        發現沒法繞過了:
查看源代碼:


單引號已經被轉換了。
相關文章
相關標籤/搜索