htmlspecialchars() 函数过滤XSS的问题

关注安全
0 73

csroad
csroad 举报
04月24日 23:34

@$ip

= htmlspecialchars($_GET['ip']);

今天看这个写法。  了解一下

htmlspecialchars 这个函数的功能 》  详细如下

htmlspecialchars() 函数把预定义的字符转换为 HTML 实体。

预定义的字符是:

预定义的字符是:

  • & (和号)成为 &
  • " (双引号)成为 "
  • ' (单引号)成为 '
  • < (小于)成为 &lt;
  • > (大于)成为 &gt;
  • <span style="background-color: rgb(248, 248, 248); color: rgb(51, 51, 51); font-family: "Courier New"; font-size: 0.8em; white-space: pre-wrap;">> (大于)成为 > 

    它的语法如下:

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


      轻松绕过:

     

     

        加上ENT_QUOTES参数:


      

    1
    2
    3
    4
    5
    6
    <?php  
        $name $_GET["name"]; 
        $name = htmlspecialchars($name, ENT_QUOTES); 
    ?> 
       
    <input type='text' value=''

            发现无法绕过了:

    查看源代码:



    单引号已经被转换了。