我试图避免在我的应用程序中使用跨方脚本但我的要求是我必须将包括脚本在内的数据保存到我的数据库中,但是当显示相同的数据时,它应该作为文本而不是作为脚本显示例如:
第1步:我在网站上有一个文本框,我试图通过以下代码注入
测试数据警报('恶意代码');
第2步:我正在保存数据库中文本的确切内容(请注意,validateRequest设置为false)。
第3步:然后我在网页中发布不应该执行脚本的内容。
注意:我已经通过AntiXss和Sanitizer限制了它,但是当我使用Sanitizer时,Sanitizer忽略了脚本,任何人都可以给我一个解决方案来显示脚本作为文本(也应避免执行脚本。)
答案 0 :(得分:1)
在你的情况下,
“他们不应该一起工作”。您的asp.net验证与危险的输入相冲突(尽管它来自antixss库)。
Validate Request = "true"
是ASP.Net安全机制。它旨在通过过滤(使用启发式或白名单,我不确定)输入中的潜在危险标记来保护您免受XSS攻击。例如,如果您创建ASP.Net应用程序,并且Validate Request = "true"
,并且当您尝试输入查询字符串参数时,如
SaveProduct.aspx?q=<script>alert(1);</script>
,你会得到“从cliet中检测到一个有潜在危险的Request.Form值... blah blah blah ”。即操作中的Validate Request =“true”,可以在页面级别设置,也可以在web.config中设置。
现在,使用antixss库的意义在于,当你遇到类似于现在的情况时 - 将用户输入本身(具有潜在危险的输入),将其保存在某处,并将其显示给用户 - 您需要转向ASP.Net的验证请求。通过这样做,您告诉ASP.Net将Web应用程序的安全性留给您。您负责处理XSS漏洞,而不是ASP.Net。保存到数据库时使用antixss'GetSafeHtmlFragment()
方法来清理输入。另请注意antixss version 4.2.1 is known for strict escaping。
在向具有漏洞的用户显示内容时,您必须将HTML编码到上下文中。例如,如果要在javascript,css或html中输出潜在危险的字符串,则必须根据javascript,css或html编码对其进行编码。更多信息 - What is the difference between AntiXss.HtmlEncode and HttpUtility.HtmlEncode?
我建议您使用antixss库,html编码来评估您的选项。但您的解决方案是关闭验证请求。在保存到数据库之前使用antixss(我更喜欢Html Agility包),并在显示页面的html上下文之前使用HtmlEncode()
。 Rick Strahl在这里有一个使用Html Agility Pack的示例实现 - http://weblog.west-wind.com/posts/2012/Jul/19/NET-HTML-Sanitation-for-rich-HTML-Input。
请务必阅读以下问题,以便深入了解并正确实施。