HTML和属性编​​码

9 html xss encoding

我碰到一个对元SO后,我很好奇什么是未编码和编码的HTML字符之间的细微差别,在HTML属性,在上下文:安全,最佳实践和浏览器的支持.

Hac*_*ese 9

HTML编码替换在HTML标记中具有语义意义的某些字符,其中可以向用户显示等效字符,而不会影响解析标记.

是<,>,&和"它们与替换的最显著和明显的字符&lt;,&gt;,&amp;,和&quot;分别.此外,编码器可以用等价的HTML实体编码替换高阶字符,因此内容可以被保留,并即使在页面以ASCII格式发送到浏览器的情况下也能正确呈现.

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


就与XSS有何关联而言,您希望从外部源(例如用户)正确清理字符串,这样它们就不会破坏您的页面,或者更重要的是,注入可能会改变或破坏您的应用程序的标记和脚本,或者影响用户的计算机(利用浏览器或平台漏洞).

如果要在页面中显示用户生成的内容,则需要对字符串进行HTML编码,然后将其显示在标记中,并且输入的所有内容都将按字面显示,而不必担心XSS或损坏的标记.

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

您是否可以使用相同的HTML编码功能来处理属性编码?从技术上讲,是的.在你链接的元问题的情况下,听起来他们正在使用编码和解码它的HTML,然后使用该结果作为属性值,这导致编码标记按字面显示,如果你遵循.

  • 因为HTML5支持双引号,单引号和无引号属性,所以在一般情况下,关于字符在字符中转义的建议是不够​​的。仅假定您始终使用双引号引起来的属性,并且永远不要将数据粘贴在onclick之类的javascript事件处理程序中。 (2认同)

Luk*_*uke 5

我建议您查看OWASP XSS预防规则1和2
简短摘要...

规则1 HTML

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

第2条HTML通用属性

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

  • 问题是规则 2 要求不合理……它基本上是说“逃避一切,以防万一你忘记引用你的属性。” 但是,如果你的属性被正确引用,那么你不需要逃避这一切。如果备忘单用于向开发人员提供有关其代码是否易受攻击的反馈,则没有任何帮助。 (3认同)