htmlspecialchars() 函數過濾XSS的問題


 htmlspecialchars()函數的功能如下:

 

htmlspecialchars() 函數把預定義的字符轉換為 HTML 實體。

預定義的字符是:

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

    其中第二個參數flags需要重要注意,很多開發者就是因為沒有注意到這個參數導致使用htmlspecialchars()函數過濾XSS時被繞過。因為flags參數對於引號的編碼如下:

 

可用的引號類型:

  • 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?>'>  

  

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


單引號已經被轉換了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM