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

标签 php html security xss

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

The translations performed are:

  • '&' (ampersand) becomes &amp;
  • " (double quote) becomes &quot; when ENT_NOQUOTES is not set.
  • ' (single quote) becomes &#039; only when ENT_QUOTES is set.
  • '<' (less than) becomes &lt;
  • '>' (greater than) becomes &gt;

但是,我记得在像 IE6 这样的旧浏览器中,还有 其他字节序列 导致浏览器的 DOM 解析器为 interpret content as 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

最佳答案

没有。当我研究使用 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/

相关文章:

c# - 如何从收到的 msmq 消息中获取发件人的 WindowsIdentity?

security - Redis 写入 .ssh/authorized_keys

html - 如果在 flexitem 中输入,则 Flex 框忽略宽度

javascript - 如何清除 JavaScript 中的敏感内存?

php - (插入+重复键更新)+更新?

php - 如何在 CodeIgniter 的一个 View 中使用多种语言?

php - 将列更新为连接列中的值

php - API平台: how to test file upload with ApiTestCase

javascript - 在 Web 表单中为一个参数传递多个值

jquery - 如何设置 Bootstrap 选项卡的高度和边框?