起因

今天在添加数据的时候系统抛出了下面这个错误,初步推断,应该是使用了ueditor编辑器传递的数据里面有未转义的html标签造成的。

1
2
3
4
5
6
System.Web.HttpRequestValidationException: 从客户端(details="<h3>关于我</h3><p>向支持者介...")中检测到有潜在危险的 Request.Form 值。
   在 System.Web.HttpRequest.ValidateString(String value, String collectionKey, RequestValidationSource requestCollection)
   在 System.Web.HttpRequest.<>c__DisplayClass5.<ValidateHttpValueCollection>b__3(String key, String value)
   在 System.Web.HttpValueCollection.EnsureKeyValidated(String key)
   在 System.Web.HttpValueCollection.Get(String name)
   在 System.Collections.Specialized.NameValueCollection.get_Item(String name)

在ASP.NET中,每一次接收数据,都会对数据进行检查,如果数据中包含非法字符串,就会抛出这个错误。这个错误更像是一个提醒,提醒你这里的数据会含有非法字符串,会对系统造成威胁,让你采取一些措施进行防范。在刚学习 ASP.NET 的时候遇到过这个错误,后来使用 Server.HtmlEncode() 函数将所有的 HTML 标签进行转义才解决了这个问题。接收数据已经过滤转义了,但还是出现这个的错误,让我有点懵,最后经过不断的调试和百度才找到了解决方法。

解决方法

方法一:在Web.config的system.web加上下面这两个节点:

1
2
<httpRuntime requestValidationMode="2.0" />
<pages validateRequest="false"/>

如果 system.web 里面有 httpRuntime 这个节点,就给他添加 requestValidationMode=”2.0” 属性值就行了。

方法二:比较好的解决方法就是在 aspx 文件中添加:

1
<%@ Page validateRequest="false" %>

总结

如果使用了方法一,那么整站来自用户的输入都不会进行检查了,如果你不对数据进行转义的话,系统也不会抛出异常,但是这些非法字符会对你的系统造成一些危害。而第二种方法就只针对当前文件屏蔽检查,而其他页面依然会对用户输入进行检查,所以推荐使用方法二。

不管是使用哪种方法,一定要记得使用 Server.HtmlEncode() 等函数对数据进行过滤。


2017.2.8 23:45 更新感谢@姜辰的问题,让我发现了文中的一些错误,已进行修改。

这是一篇过去很久的文章,其中的信息可能已经有所发展或是发生改变。