我遇到了一个post on Meta SO,我很好奇未编码和编码的HTML字符之间的细微差别,HTML属性中的 ,在以下情况下:安全,最好 - 实践和浏览器支持。
答案 0 :(得分:9)
HTML编码替换HTML标记中具有语义意义的某些字符,并且可以向用户显示等效字符,而不会影响解析标记。
最重要和最明显的字符是&lt;,&gt;,&amp;和“,它们被<
,>
,&
和"
取代另外,编码器可以用等效的HTML实体编码替换高阶字符,因此即使页面以ASCII格式发送到浏览器,内容也可以保存并正确呈现。
"
,&
和<
一起替换。这是因为属性的性质,它们包含的数据以及它们如何被浏览器或HTML解析器解析和解释,与HTML文档及其元素的读取方式不同。
就如何与XSS相关,您希望从外部源(例如用户)正确清理字符串,以便它们不会破坏您的页面,或者更重要的是,注入可以改变或破坏的标记和脚本您的应用程序或影响用户的计算机(通过利用浏览器或平台漏洞)。
如果要在页面中显示用户生成的内容,您需要对字符串进行HTML编码,然后将其显示在标记中,并且输入的所有内容都将按字面显示,而不必担心XSS或标记损坏。
如果您需要将用户生成的内容附加到属性中的元素(例如,链接上的tooltip
),您将属性编码以确保内容不会破坏元素的标记
您是否可以使用相同的HTML编码功能来处理属性编码?从技术上讲,是的。在您链接的元问题的情况下,听起来他们正在使用编码和解码它的HTML,然后将该结果用作属性值,这导致编码标记按字面显示,如果您遵循。
答案 1 :(得分:5)
我建议查看OWASP XSS Prevention Rules 1 and 2 简要总结......
HTML规则1
HTML公共属性使用HTML实体编码转义以下字符...
&
- &gt;&
<
- &gt;<
>
- &gt;>
"
- &gt;"
'
- &gt;'
/
- &gt;/
规则2
除了字母数字字符外,使用&amp; #xHH转义ASCII值小于256的所有字符;格式(或命名实体,如果可用),以防止切换出属性。这条规则如此广泛的原因是开发人员经常将属性置于不引用状态。适当引用的属性只能使用相应的引用进行转义。不带引号的属性可以用许多字符来分解,包括[space]%* +, - /; &LT; =&gt; ^和|。