在他们的规则 #1 中,OWASP建议&应该在&插入 HTML 页面之前对其进行编码。但是,在以下情况下:
<tag>userInput</tag>
<tag attribute="userInput"></tag>
如果我只转义四个字符<,>. '并且",但不是&,是否有任何有效载荷仍可能导致 XSS?或者是否有任何情况&必须逃脱以防止 XSS 漏洞?
在他们的规则 #1 中,OWASP建议&应该在&插入 HTML 页面之前对其进行编码。但是,在以下情况下:
<tag>userInput</tag>
<tag attribute="userInput"></tag>
如果我只转义四个字符<,>. '并且",但不是&,是否有任何有效载荷仍可能导致 XSS?或者是否有任何情况&必须逃脱以防止 XSS 漏洞?
正如评论所说和您的链接文档:
规则 #1 适用于您想将不受信任的数据直接放入 HTML 正文中的某个位置。这包括内部的普通标签,如 div、p、b、td 等。
所以你的问题可以用“因为你为你的上下文应用了错误的规则”来回答。
但也要引用适用的规则:
这条规则如此广泛的原因是开发人员经常不引用属性。正确引用的属性只能使用相应的引号进行转义。不带引号的属性可以用许多字符分开,包括 [space] % * + , - / ; < = > ^ 和 |。
所以,是的,如果你一直并且总是在属性上使用引号,你只需要转义这些。但这只需要一次失误,事情就会崩溃,所以一般规则是比绝对必要的更严格。
编码不会使您免受任何 XSS 攻击,但它是正确编码用户输入 HTML 的文本所必需的&。&
例如,如果您不这样做,那么想要谈论 HTML 实体并键入这五个字符的用户& a m p ;将看到该站点&在其浏览器中显示他们的文本。谈论 XSS 预防解释的用户< to <会在网站上看到他们的文本呈现为< to <,让所有人感到困惑。除非您特别警告用户他们的帖子将(部分)解释为 HTML 并且他们应该对自己的帖子进行实体编码,否则您应该为正确性而不是安全性而做。