htmlspecialchars vs htmlentities 当与 XSS 有关时

2022-08-30 14:58:04

我看到很多关于这个问题的相互矛盾的答案。许多人喜欢引用php函数本身并不能保护你免受xss的侵害。

究竟什么XSS可以通过htmlspecialchars,什么可以通过htmlentities?

我了解功能之间的区别,但不了解您剩下的不同级别的xss保护。谁能解释一下?


答案 1

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&amp;ddddd&quot;fancyË

echo htmlentities($_GET['password'], ENT_COMPAT | ENT_HTML401, 'UTF-8') . "\n";
// Output: asdf&amp;ddddd&quot;fancy&Euml;quotes

您应该始终使用 htmlentities,并且在清理用户输入时很少使用 htmlspecialchars。因此,您应该始终在之前剥离标签。对于真正重要和安全的网站,你永远不应该相信strip_tags()。使用 HTMLPurifier for PHP


答案 2

如果 PHP 的 header 命令用于设置字符集

header('Content-Type: text/html; charset=utf-8');

那么htmlspecialcharshtmlentities对于HTML的输出应该是安全的,因为XSS不能使用UTF-7编码来实现。

请注意,这些函数不应用于将值输出到 JavaScript 或 CSS 中,因为可以输入使 JavaScript 或 CSS 能够转义并使您的网站面临风险的字符。请参阅 XSS 预防备忘单,了解如何正确处理这些情况。


推荐