牛骨文教育服务平台(让学习变的简单)
博文笔记

htmlspecialchars() 函数过滤XSS的问题

创建时间:2017-03-05 投稿人: 浏览次数:1821

        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?>">
        发现无法绕过了: 查看源代码:

单引号已经被转换了。
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。