答案here https://stackoverflow.com/questions/9124134/cross-site-scripting-xss-do-i-need-to-escape-the-ampersand仅在 HTML 属性上下文中的嵌套 JavaScript 上下文中解决该问题,而您的问题专门询问纯 HTML 上下文转义。
在这个问题中,转义应该按照JavaScript 的 OWASP 推荐 https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet#Output_Encoding_Rules_Summary:
除字母数字字符外,请使用 \uXXXX unicode 转义格式(X = 整数)对所有字符进行转义。
哪个已经处理了&
因为它不是字母数字。
为了回答你的问题,
从实际的角度来看,为什么你不会吗转义 & 符号?
HTML 表示形式为&
is &
,所以这样做很有意义。如果您没有这样做,则每当用户输入&
, <
, or >
到您的应用程序中,您的应用程序将呈现&
, <
, or >
代替&
, <
or >
.
边缘情况?确实。安全问题?不应该的。
来自HTML5 语法 字符参考部分 https://www.w3.org/TR/html5/syntax.html#character-references:
字符引用必须以 U+0026 与字符 (&) 开头。
接下来,有三种可能的角色
参考:
- 命名角色参考
- 十进制数字字符参考
- 十六进制数字字符参考
When an &
遇到:
切换到数据状态。
尝试使用字符引用,不允许额外使用
特点。
如果未返回任何内容,则发出 U+0026 与字符 (&) 标记。
否则,发出返回的字符标记。
因此,之后的任何事情&
会导致&
要输出或表示的字符。由于以下字符必须是字母数字,否则它们将不会被使用,因此不可能出现转义字符(例如'
, "
, >
, <
)被消耗和忽略,因此攻击者改变解析上下文的安全风险很小。然而,你永远不知道是否存在不完全遵循标准的浏览器错误,因此我总是会逃避&
。 Internet Explorer 有一个问题,您可以指定<%
它会被解释为<
允许绕过 .NET 请求验证以进行 XSS 攻击。安全总比后悔好。