【问题标题】:Why Ampersand should be escaped because of XSS injection为什么 & 符号应该因为 XSS 注入而被转义
【发布时间】:2016-08-29 20:21:31
【问题描述】:

OWASP 推荐使用转义来防止 XSS 注入的五个字符是 &, <, >, ", '.

其中,我不明白为什么要转义&(ampersand) 以及如何将其用作注入脚本的向量。有人可以举一个例子,所有其他四个字符都被转义但&符号没有,所以会有XSS注入漏洞。

我已经检查了另一个问题,但那个答案并没有让事情变得更清楚。

【问题讨论】:

标签: security escaping xss


【解决方案1】:

答案here 仅在 HTML 属性上下文中的嵌套 JavaScript 上下文中解决该问题,而您的问题专门询问纯 HTML 上下文转义。

在那个问题中,转义应该按照OWASP recommendation for JavaScript

除字母数字字符外,使用 \uXXXX unicode 转义格式(X = Integer)转义所有字符。

已经可以处理&,因为它不是字母数字。

回答你的问题, 从实际的角度来看,为什么你不转义&符号?

& 的 HTML 表示是 &,所以这样做很有意义。如果您不这样做,任何时候用户在您的应用程序中输入&amp&lt&gt,您的应用程序将呈现&<>,而不是&amp、@987654334 @ 或&gt

边缘案例?确实。安全问题?不应该。

来自HTML5 syntax Character references section

字符引用必须以 U+0026 AMPERSAND 字符 (&) 开头。 在此之后,有三种可能的字符 参考资料:

  • 命名字符引用
  • 十进制数字字符引用
  • 十六进制数字字符引用

当遇到& 时:

切换到数据状态。

尝试使用字符引用,不允许额外 字符。

如果没有返回任何内容,则发出 U+0026 AMPERSAND 字符 (&) 标记。

否则,发出返回的字符标记。

因此,& 之后的任何内容都将导致输出 & 或表示的字符。由于以下字符必须是字母数字,否则它们将不会被使用,因此不可能使用和忽略转义字符(例如'"><),因此存在攻击者更改解析上下文的安全风险很小。但是,您永远不知道是否存在不完全符合标准的浏览器错误,因此我总是会转义 &。 Internet Explorer 存在一个问题,您可以指定 <%,它会被解释为 <,从而允许绕过 XSS 攻击向量的 .NET 请求验证。安全总比后悔好。

【讨论】:

  • 感谢您的回答。这解决了我的困惑。我相信最好在 OWASP 上记录解释,而不是只告诉你应该逃避什么而不给出例子。有些人不假思索地接受它,但人们真的会考虑每个有相同问题的字符。我在 stackoverflow 上看到了另一个相同的问题,但没有答案。
猜你喜欢
  • 2014-08-20
  • 2011-01-06
  • 2018-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-13
  • 2014-04-11
相关资源
最近更新 更多