为什么我应该将 & 转换为 & 在 XSS 预防中?

信息安全 xss
2021-08-18 02:59:25

在他们的规则 #1 中,OWASP建议&应该在&插入 HTML 页面之前对其进行编码。但是,在以下情况下:

<tag>userInput</tag>
<tag attribute="userInput"></tag>

如果我只转义四个字符<>. '并且",但不是&,是否有任何有效载荷仍可能导致 XSS?或者是否有任何情况&必须逃脱以防止 XSS 漏洞?

2个回答

正如评论所说和您的链接文档:

规则 #1 适用于您想将不受信任的数据直接放入 HTML 正文中的某个位置。这包括内部的普通标签,如 div、p、b、td 等。

所以你的问题可以用“因为你为你的上下文应用了错误的规则”来回答。

但也要引用适用的规则:

这条规则如此广泛的原因是开发人员经常不引用属性。正确引用的属性只能使用相应的引号进行转义。不带引号的属性可以用许多字符分开,包括 [space] % * + , - / ; < = > ^ 和 |。

所以,是的,如果你一直并且总是在属性上使用引号,你只需要转义这些。但这只需要一次失误,事情就会崩溃,所以一般规则是比绝对必要的更严格。

编码不会使您免受任何 XSS 攻击,但它是正确编码用户输入 HTML 的文本所必需的&&amp;

例如,如果您不这样做,那么想要谈论 HTML 实体并键入这五个字符的用户& a m p ;将看到该站点&在其浏览器中显示他们的文本。谈论 XSS 预防解释的用户< to &lt;会在网站上看到他们的文本呈现为< to <,让所有人感到困惑。除非您特别警告用户他们的帖子将(部分)解释为 HTML 并且他们应该对自己的帖子进行实体编码,否则您应该为正确性而不是安全性而做。