在HTML中,有几个特殊字符< > & ' "
这对 DOM 解析器具有重要意义。这些是PHP的htmlspecialchars等流行函数的字符转换为 HTML 实体,以便它们在解析时不会意外触发。
The translations performed are:
- '&' (ampersand) becomes
&
"
(double quote) becomes"
when ENT_NOQUOTES is not set.'
(single quote) becomes'
only when ENT_QUOTES is set.- '<' (less than) becomes
<
- '>' (greater than) becomes
>
但是,我记得在像 IE6 这样的旧浏览器中,还有 其他字节序列 导致浏览器的 DOM 解析器为 interpret content as HTML .
今天这仍然是个问题吗?如果仅过滤这 5 个是否足以防止 XSS?
例如,这里是字符“<”在 HTML 和 JavaScript(UTF-8 格式)中的所有已知组合。
<
%3C
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
\x3c
\x3C
\u003c
\u003C
最佳答案
没有。当我研究使用 CSS 和属性根据内容自动分配样式时,我实际上研究过这个 (my question),简短的回答是否定的。现代浏览器不允许将“字节序列”用作 HTML。我很少使用“字节序列”,因为风险最大的代码不使用字节编码值。
XSS 站点上列出的示例是关于使用属性并将 javascript 解释为需要执行的字符串。但也列出了诸如 &{alert('XSS')}
之类的东西,它运行括号内的代码,并且该代码在现代浏览器中不起作用。
但要回答您的第二个问题,不,过滤这 5 个不足以防止 XSS 攻击。始终通过 PHP HTML 特殊字符代码抛出您的代码,但有一个 hundreds of byte codes that can be used你真的无法保证任何事情。通过 PHP 过滤器(尤其是 htmlentities()
)发送它会为您提供输出为 HTML 时输入的准确文本(IE «
而不是 «)。也就是说,在大多数情况下,根据您的使用情况,使用 htmlspecialchars
足以覆盖大多数 攻击。取决于您将如何使用输入,但在大多数情况下它是安全的。
XSS 是一个棘手的问题。一般的好规则总是过滤用户将输入的所有内容。并使用白名单而不是黑名单。你在这里谈论的是将这些值列入黑名单,而假设你的用户是恶意的并且只允许某些事情总是更安全。
关于php - 是否有其他序列浏览器解释为 HTML 特殊字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8626337/