我最近学习并测试了可以针对我的网站发起以下xss攻击 - 在小提琴作曲家中更改POST请求,以便任何文本字段都包含此内容:
<%u0008script>alert(1);<%u0008/script>
与包含此值(未编码)的任何标签相比,将执行alert(1)。正确的解决方案是始终正确编码所有输出。但我也修改了RequestValidator:
protected override bool IsValidRequestString(HttpContext context, string value, RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex) {
if (requestValidationSource == RequestValidationSource.Form) {
if (value.IndexOf("<\bscript") >= 0) {
validationFailureIndex = -1;
return false;
}
}
return base.IsValidRequestString(context, value, requestValidationSource, collectionKey, out validationFailureIndex);
}
然后我觉得 - 有人必须已经通过这个,是否有任何开源覆盖RequestValidator将是
1)至少与原生ASP.NET版本一样强大
2)也会处理这个xss
3)可以处理更多
答案 0 :(得分:2)
这正是我们(ASP.NET团队)结束请求验证并最终将其从产品中删除的原因之一。它可能在10年前推出时很好,但在2014年它不足以阻止真实的XSS攻击。相反,开发人员应根据其业务逻辑验证所有输入,并且他应该以对底层传输安全的方式对所有输出进行适当编码。有关详细信息,请参阅http://www.asp.net/aspnet/overview/web-development-best-practices/what-not-to-do-in-aspnet,-and-what-to-do-instead#validation。
答案 1 :(得分:0)
.NET 4.5添加了the AntiXSS library,可以防止此类攻击,并且只允许安全字符替换HtmlEncode等的默认实现。 HtmlEncode的字符列表显示在方法documentation。
中请注意,您遇到的不是请求验证问题,更不用说.NET中的错误了。在你的情况下,什么是无效输入可能是另一种情况下的有效输入,例如论坛帖子编辑器,如SO&#39。
实际问题是内容编码问题:内容未以安全方式呈现,这会阻止浏览器将其解释为脚本。