OWASP建议逃避以防止XSS注射的五个字符是
&
,<
,>
,"
,'
。
其中,我无法理解为什么应该转义&
(&符号)以及如何将其用作注入脚本的向量。有人可以举例说明所有其他四个被转义的字符但是&符号不是那么会有XSS注入漏洞。
我已经检查了另一个问题,但答案确实没有让事情变得更清楚。
答案 0 :(得分:4)
答案here仅在HTML属性上下文中的嵌套JavaScript上下文中解决问题,而您的问题则专门询问纯HTML上下文转义。
在该问题中,转义应符合OWASP recommendation for JavaScript:
除字母数字字符外,使用\ uXXXX unicode转义格式(X =整数)转义所有字符。
哪个已经处理&
,因为它不是字母数字。
回答你的问题, 从实际的角度来看,为什么你不能逃避&符号?
&
的HTML表示形式为&
,因此这样做很有意义。如果您没有,则只要用户在您的应用中输入&
,<
或>
,您的应用就会呈现&
,<
或{ {1}}代替>
,&
或<
。
边缘案例?当然。安全问题?它不应该是。
来自HTML5 syntax Character references section:
字符引用必须以U + 0026 AMPERSAND字符(&amp;)开头。 在此之后,有三种可能的角色 引用:
- 命名字符引用
- 十进制数字字符引用
- 十六进制数字字符引用
遇到>
时:
切换到数据状态。
尝试使用字符引用,不允许额外使用 字符。
如果没有返回任何内容,则发出一个U + 0026 AMPERSAND字符(&amp;)标记。
否则,发出返回的字符标记。
因此,&
之后的任何内容都会导致输出&
或代表字符。由于以下字符必须是字母数字或者不会被消费,因此不存在转义字符(例如&
,'
,"
,>
)被消费和忽略,因此攻击者改变解析上下文的安全风险很小。但是,您永远不知道是否存在不完全符合标准的浏览器错误,因此我总是会逃避<
。 Internet Explorer存在一个问题,您可以在其中指定&
,它将被解释为<%
,允许绕过XSS攻击向量的.NET请求验证。总是更安全而不是抱歉。