在我的ASP.NET MVC 5应用程序中,我正在从表单中读取一些数据,然后在后端对操作方法进行jQuery ajax调用,以将其保存到我的数据库中。
在表单中,如果我在其中输入带有HTML标记的文本,我会因HTML标记而出错。我得到了标准" ......有潜在危险......"错误。
我使用GetSafeHtmlFragment()清理后端数据,但是一旦数据到达我的操作方法就会生成错误。
从客户端脚本向我的操作方法发送数据的正确方法是什么? jquery ajax打电话?我首先在我的JS事件处理程序中对数据进行HTML编码,然后将其发送到我的操作方法吗?
答案 0 :(得分:1)
无论是客户端脚本(XHR)还是直接HTTP请求,ASP.Net运行时都使用Request Validation来阻止请求。
好吧,在MVC中,这会在您到达Action方法中的GetSafeHtmlFragment()之前发生。您需要做的是关闭期望带有标记的数据的操作方法的请求验证。
您对how you want to turn off the Request Validation进行了细粒度的控制。
如果您有一个Model类,其中您的标记数据是属性 - 使用[AllowHtml]
属性来修饰该Model的属性,因此请求验证不会应用于该属性
如果要关闭Action方法或整个控制器的请求验证,请使用[ValidateInput(false)]
作为Action方法或Controller本身。
没有堆栈跟踪或更多细节,这是我能想到的最佳答案。只要您了解允许标记(包括潜在危险的标记)作为数据,关闭请求验证就不错了。
由于您已经拥有GetSafeHtmlFragment(),因此请关闭特定属性的Request Validation或Action方法。而且,对于微软的Antixss库作为消毒剂,你应该注意以下几点:
EKSith Antixss 4.2打破一切 - http://eksith.wordpress.com/2012/02/13/antixss-4-2-breaks-everything/
Microsoft Anti-XSS Library Bypass(MS12-007) - http://blog.watchfire.com/wfblog/2012/01/microsoft-anti-xss-library-bypass.html