我确信这个问题的答案是否定的,但我似乎找不到简单地将<
和>
转换为<
和{{1}的方法没有完全阻止反射和持久的XSS。
我不是在谈论CSRF。
如果这不能阻止XSS,你能举例说明如何绕过这种防御吗?
答案 0 :(得分:10)
并非所有XSS攻击都包括&lt;或者&gt;完全取决于数据的插入位置。
答案 1 :(得分:7)
在属性中使用不受信任的字符串(引用"
)时,您需要将"
转义为"
。
否则你可以轻松注入javascript。例如,<a href="{{str}}">
str
为" onmouseover='something-evil'"
。
答案 2 :(得分:5)
没有。以下是一些例子,其中<
,>
,'
,"
和&
是不够的:
示例1:
<a href="{{myUrl}}">
XSS攻击:
myUrl = "javascript:alert(1)"
示例2:
<script>var page = {{myVar}};</script>
XSS攻击:
myVar = "1;alert(1)"
有关预防这些攻击的方法,请参阅https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet。
答案 3 :(得分:3)
不,这还不够。请记住,XSS不仅仅是关于HTML中不受信任的数据,您还可以在JavaScript和CSS中找到它。考虑一下诸如“var myVar = [input];”之类的情况。你可以用这个[输入]值做各种各样的恶意事情而不需要靠近尖括号。在XSS备忘单中还有更多示例:http://ha.ckers.org/xss.html
你在标签中提到过ASP.NET;你想看的是[AntiXSS library][1]
。抓住这个并使用适当的输出编码:
Encoder.CssEncode()
Encoder.HtmlEncode()
Encoder.HtmlAttributeEncode()
Encoder.JavaScriptEncode()
等。绝对没有理由尝试在.NET中进行自己的字符替换。