是否有其他序列浏览器解释为HTML特殊字符?

Xeo*_*oss 6 html php security xss

在HTML中,有几个特殊字符< > & ' "对DOM解析器有重要意义.这些是流行函数的字符,例如PHP的htmlspecialchars转换为HTML实体,因此它们在解析时不会意外触发.

执行的翻译是:

  • '&'(&符号)变成了 &amp;
  • "(双引号)&quot; 在未设置ENT_NOQUOTES时变为.
  • '(单引号)&#039;仅在设置了ENT_QUOTES 时才会出现.
  • '<'(小于)成为 &lt;
  • '>'(大于)变为 &gt;

但是,我记得在像IE6这样的旧浏览器中,还有其他字节序列导致浏览器的DOM解析器将内容解释为HTML.

今天这仍然是个问题吗?如果单独过滤这些5就足以防止XSS?

例如,以下是 HTML和JavaScript中的字符"<"的所有已知组合(UTF-8).

<
%3C
&lt
&lt;
&LT
&LT;
&#60
&#060
&#0060
&#00060
&#000060
&#0000060
&#60;
&#060;
&#0060;
&#00060;
&#000060;
&#0000060;
&#x3c
&#x03c
&#x003c
&#x0003c
&#x00003c
&#x000003c
&#x3c;
&#x03c;
&#x003c;
&#x0003c;
&#x00003c;
&#x000003c;
&#X3c
&#X03c
&#X003c
&#X0003c
&#X00003c
&#X000003c
&#X3c;
&#X03c;
&#X003c;
&#X0003c;
&#X00003c;
&#X000003c;
&#x3C
&#x03C
&#x003C
&#x0003C
&#x00003C
&#x000003C
&#x3C;
&#x03C;
&#x003C;
&#x0003C;
&#x00003C;
&#x000003C;
&#X3C
&#X03C
&#X003C
&#X0003C
&#X00003C
&#X000003C
&#X3C;
&#X03C;
&#X003C;
&#X0003C;
&#X00003C;
&#X000003C;
\x3c
\x3C
\u003c
\u003C
Run Code Online (Sandbox Code Playgroud)

Lov*_*ing 4

不。实际上,当我研究使用 CSS 和属性根据内容(我的问题)自动分配样式时,我研究了这一点,简短的答案是否定的。现代浏览器不允许将“字节序列”用作 HTML。我很少使用“字节序列”,因为风险最大的代码不使用字节编码值。

XSS 站点上列出的示例涉及使用属性并将 JavaScript 解释为需要执行的字符串。但还列出了诸如&{alert('XSS')}运行括号内的代码之类的内容,并且该代码在现代浏览器中不起作用。

但要回答你的第二个问题,不,过滤这 5 个不足以防止XSS攻击。始终将您的代码放入 PHP HTML 特殊字符代码中,但是可以使用数百个字节代码,您将无法真正保证任何事情。通过 PHP 过滤器(尤其是htmlentities())发送它将为您提供在将其输出到 HTML 时输入的确切文本(IE&laquo;而不是 «)。也就是说,在大多数情况下,根据您的使用情况,使用htmlspecialchars足以应对大多数攻击。取决于您将如何使用输入,但在大多数情况下它是安全的。

XSS 是一件很难解释的事情。一般的好规则是始终过滤用户将输入的所有内容。并使用白名单而不是黑名单。您在这里谈论的是将这些值列入黑名单,而假设您的用户是恶意的并且只允许某些事情总是更安全。