11

在 Meta SO 上看到了一篇文章,我很好奇未编码和编码的 HTML 字符之间的细微差别,在 HTML 属性中,在以下环境中:安全性、最佳实践和浏览器支持。

4

2 回答 2

12

HTML 编码将在 HTML 标记中具有语义意义的某些字符替换为可以显示给用户而不影响解析标记的等效字符。

最重要和最明显的字符是 <、>、& 和 ",它们分别被替换为&lt;&gt;&amp;&quot;。此外,编码器可以用等效的 HTML 实体编码替换高位字符,因此可以保留内容并即使页面以 ASCII 格式发送到浏览器,也能正确呈现。

另一方面,HTML 属性编码仅替换那些对防止字符串破坏 HTML 元素的属性很重要的字符的子集。具体来说,您通常只需将 "、& 和 < 替换为&quot;&amp;&lt;。这是因为属性的性质、它们包含的数据以及它们如何被浏览器或 HTML 解析器解析和解释的方式与读取 HTML 文档及其元素。


就这与 XSS 的关系而言,您希望正确清理来自外部源(例如用户)的字符串,以便它们不会破坏您的页面,或者更重要的是,注入可以改变或破坏您的应用程序的标记和脚本或影响用户的机器(通过利用浏览器或平台漏洞)。

如果您想在页面中显示用户生成的内容,您需要对字符串进行 HTML 编码,然后将其显示在您的标记中,他们输入的所有内容都将按字面显示,而无需担心 XSS 或损坏的标记。

如果您需要将用户生成的内容附加到属性中的元素(例如,tooltip链接上的 a),您需要进行属性编码以确保内容不会破坏元素的标记。

您可以使用相同的 HTML 编码函数来处理属性编码吗?从技术上讲,是的。在您链接的元问题的情况下,听起来他们正在获取经过编码和解码的 HTML,然后使用该结果作为属性值,如果您遵循的话,这会导致编码标记按字面意思显示。

于 2012-11-06T08:08:27.537 回答
6

我建议查看OWASP XSS 预防规则 1 和 2
一个简短的总结...

HTML规则1

使用 HTML 实体编码转义以下字符 ...
&--> &amp;
<--> &lt;
>--> &gt;
"--> &quot;
'--> &#x27;
/-->&#x2F;

HTML 通用属性规则2

除字母数字字符外,使用 &#xHH; 转义所有 ASCII 值小于 256 的字符。格式(或命名实体,如果可用)以防止切换出属性。这条规则如此广泛的原因是开发人员经常不引用属性。正确引用的属性只能使用相应的引号进行转义。不带引号的属性可以用许多字符分开,包括 [space] % * + , - / ; < = > ^ 和 |。

于 2015-11-19T18:29:11.037 回答