htmlspecialchars vs htmlentities 当与 XSS 有关时
我看到很多关于这个问题的相互矛盾的答案。许多人喜欢引用php函数本身并不能保护你免受xss的侵害。
究竟什么XSS可以通过htmlspecialchars,什么可以通过htmlentities?
我了解功能之间的区别,但不了解您剩下的不同级别的xss保护。谁能解释一下?
我看到很多关于这个问题的相互矛盾的答案。许多人喜欢引用php函数本身并不能保护你免受xss的侵害。
究竟什么XSS可以通过htmlspecialchars,什么可以通过htmlentities?
我了解功能之间的区别,但不了解您剩下的不同级别的xss保护。谁能解释一下?
htmlspecialchars() 不会保护您免受 UTF-7 XSS 漏洞的攻击,即使在 IE 9 中,这些漏洞仍然困扰着 Internet Explorer:http://securethoughts.com/2009/05/exploiting-ie8-utf-7-xss-vulnerability-using-local-redirection/
例如:
<?php
$_GET['password'] = 'asdf&ddddd"fancy˝quotes˝';
echo htmlspecialchars($_GET['password'], ENT_COMPAT | ENT_HTML401, 'UTF-8') . "\n";
// Output: asdf&ddddd"fancyË
echo htmlentities($_GET['password'], ENT_COMPAT | ENT_HTML401, 'UTF-8') . "\n";
// Output: asdf&ddddd"fancyËquotes
您应该始终使用 htmlentities,并且在清理用户输入时很少使用 htmlspecialchars。因此,您应该始终在之前剥离标签。对于真正重要和安全的网站,你永远不应该相信strip_tags()。使用 HTMLPurifier for PHP。
如果 PHP 的 header
命令用于设置字符集
header('Content-Type: text/html; charset=utf-8');
那么htmlspecialchars
和htmlentities
对于HTML的输出应该是安全的,因为XSS不能使用UTF-7编码来实现。
请注意,这些函数不应用于将值输出到 JavaScript 或 CSS 中,因为可以输入使 JavaScript 或 CSS 能够转义并使您的网站面临风险的字符。请参阅 XSS 预防备忘单,了解如何正确处理这些情况。