1.htmlspecialchars的用法
1.1说明
htmlspecialchars(
string $string,
int $flags = ENT_COMPAT | ENT_HTML401,
string $encoding = ini_get("default_charset"),
bool $double_encode = true
): string
1.string:
待转换的 string。
2. flag:
位掩码,由以下某个或多个标记组成,设置转义处理细节、无效单元序列、文档类型。 默认是 ENT_COMPAT | ENT_HTML401。
3. encoding:
本函数使用效果上,如果 string 对以下字符编码是有效的, ISO-8859-1、 ISO-8859-15、 UTF-8、 cp866、 cp1251、 cp1252、 KOI8-R 将具有相同的效果。 也就是说,在这些编码里, 受 htmlspecialchars() 影响的字符会占据相同的位置。
支持以下字符集:
注意:其他字符集没有认可。将会使用默认编码并抛出异常。
4. double_encode:
关闭 double_encode 时,PHP 不会转换现有的 HTML 实体, 默认是全部转换。
2.用法
总的来说,就是把字符串转换成一串编码,类似于JS编码转换和url编码转换
如下所示:
<?php
$str = '<>a sdd\'"';
echo htmlspecialchars($str, ENT_QUOTES) . PHP_EOL;
echo htmlentities($str);
上面这串代码会把字符串
<>a sdd\'"
转换成<>a sdd'" <>a sdd'"
;
2.htmlspecialchars和XSS漏洞的关联
<?php
$str = '<>a sdd\'"';
echo htmlspecialchars($str, ENT_QUOTES) . PHP_EOL;
echo htmlentities($str);
运行如上这串代码,你就会发现htmlspecialchars的用法:
- 如下1:(这是编辑器的输出结果)
- 如下2: (这是浏览器的输出结果)
浏览器和编辑器的运行结果不一样,原因是这样的,为了避免XSS漏洞的注入,可以把要输出的字符串先进行相应的编码,这样就不会运行脚本语句,但是浏览器又会将相应的编码进行转换,使用我们看到的和原来输出的一模一样。
3.如何绕过htmlspecialchars进行注入了
俗话说的好,不了解攻击如何进行防御了,对吧,所以我们马上进入实战
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
</script>
</head>
<body>
<?php
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level2.php method=GET>
<input name=keyword value="'.$str.'">
<input type=submit name=submit value="搜索"/>
</form>
</center>';
?>
<?php
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
</body>
</html>
可以把如上代码运行进行XSS注入实验,如上实验是比较困难的一种,所以我们先进行如下比较简单的一种,再来学习上面的一种,代码如下:
<?php
$name = $_GET["name"];
$name_new = htmlspecialchars($name);
?>
<form action="" method="get">
<input type='text' value='<?php echo $name_new?>' name="name">
<button>提交</button>
</form>
由于,输出在标签里面,所以不用担心><号的过滤问题,又
htmlspecialchars($name)
没有设置任何参数,所以是不过滤单引号的,所以使用如下语句:
' onmouseover='javascript:alert(1)
:前面的一个单引号让value='
形成闭合,然后再输出onmouseover='javascript:alert(1)'
我们构造语句一定要正确,否则不执行CSS
接下来讨论比较难的,如果我们只看
htmlspecialchars($str)
,这个题我们一辈子都做不出来,因为,只要我们输入脚本,就会被转义,下面还有一个突破点:
$str
,输入"><script>alert(1)</script>
进行了