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

  

        发现没法绕过了:
查看源代码:


单引号已经被转换了。
相关文章
相关标签/搜索