我正在调查我们系统中的一个错误,其中链接的title属性设置为类似click if value > 400
的内容,但显示的实际工具提示为click if value > 400
。此标题值由用户输入定义,因此原始工程师对文本进行了转义,因此不会导致XSS漏洞。 click if value > 400
变为click if value > 400
。
这个额外的转义步骤似乎导致HTML特殊字符被过多地转义,因此它们的转义值正在逐字呈现。
为了更加彻底,我检查了HTML规范,根据这一行,setAttribute
函数必须自动转义属性的值字符串。
https://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-F68F082
“如果元素中已经存在具有该名称的属性,则其值将更改为value参数的值。此值是一个简单的字符串;在设置时不会对其进行解析。所以任何标记(例如被识别为实体引用的语法)都被视为文字文本,并且在写出时需要由实现进行适当的转义。“
据我了解,这一行意味着setAttribute
函数应该转义HTML特殊字符。这是正确的解释吗?
答案 0 :(得分:2)
该引用的简单英语解释是setAttribute()
不会将值解析为HTML。原因是因为你根本不写HTML;值是纯文本,而不是HTML,所以HTML中的特殊字符通常在纯文本中没有特殊含义,并且将它们视为HTML实际上是有害的。
>
是>
的HTML表示形式。您只需要用HTML编码,而不是用纯文本编码。
答案 1 :(得分:0)
不完全是。
HTML是一种数据格式。
浏览器将解析HTML并从中生成DOM。此时,字符引用(如>
)将转换为它们所代表的字符(如>
)。
当您使用setAttribute
时,您直接更改DOM。
这完全绕过了HTML数据格式,因此HTML foo="&"
和JavaScript setAttribute("foo", "&")
将为您提供相同的最终结果。