setAttribute会自动转义HTML字符吗?

时间:2018-05-02 18:08:18

标签: javascript html

我正在调查我们系统中的一个错误,其中链接的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特殊字符。这是正确的解释吗?

2 个答案:

答案 0 :(得分:2)

该引用的简单英语解释是setAttribute()不会将值解析为HTML。原因是因为你根本不写HTML;值是纯文本,而不是HTML,所以HTML中的特殊字符通常在纯文本中没有特殊含义,并且将它们视为HTML实际上是有害的。

>>的HTML表示形式。您只需要用HTML编码,而不是用纯文本编码。

答案 1 :(得分:0)

不完全是。

HTML是一种数据格式。

浏览器将解析HTML并从中生成DOM。此时,字符引用(如>)将转换为它们所代表的字符(如>)。

当您使用setAttribute时,您直接更改DOM。

这完全绕过了HTML数据格式,因此HTML foo="&"和JavaScript setAttribute("foo", "&")将为您提供相同的最终结果。