.NET MVC从客户端中检测到有潜在危险的 Request.Form 值 的解决方法


[HttpRequestValidationException (0x80004005): 从客户端...中检测到有潜在危险的 Request.Form 值。]
System.Web.HttpRequest.ValidateString(String s, String valueName, String collectionName)

或者类似:


从客户端…中检测到有潜在危险的Request.Form 值。

或者是:


从客户端中检测到有潜在危险的Request.QueryString值

出现这个错误的原因基本上都是是在传值字符串中有非法字符“<”,'&'之类的。.NET 为了安全,默认是会检查传递的字符串值的。既然知道了问题的关键所在,那么对症下药就对了。

针对“从客户端…中检测到有潜在危险的数据值”的解决方法

根据上面的分析是.NET为了安全检测了传递字符串的值中是否包含非法字符,所以对症下药只要屏蔽.NET / .NET MVC的检查就可以了,方法有两种。

一、设置全局

在web.config中的pages节中配置validateRequest=”false”,如:

1
2
3
<system.web >
<pages validateRequest="false" ></pages > 
</system.web >

但这样,整个项目中的所有Form请求都不再验证提交内容的安全性,我本人不提倡这种做法。

二、单个页面设置(推荐)

我们在用Asp.net 开发 Web Form页面时,通常要提交包含Html内容的数据给后台程序代码处理时,会为页面设置 ValidateRequest=”false” 属性,设置后,讨厌的 “从客户端 … 中检测到有潜在危险的 Request.Form 值”的错误就会被屏蔽掉了。

如果你使用的是.NET MVC开发,那么也很简单,只需要在要处理的Action中添加属性[ValidateInput(false)]即可,类似以下:

1
[ValidateInput(false)]public ActionResult Index(string value){}

但是如果你使用的是MVC 3.0甚至更低版本,那么你会发现做了以上的设置后还是无效。这是因为你还需要在web.config中做以下设置:

1
2
3
<system.web >
<httpRuntime requestValidationMode="2.0" / >
</system.web >

PS:如果你遇到MVC.NET解决validateRequest设置为false不起作用,看看是不是因为这个原因,在MVC项目中,Views文件夹下与主项目下,都会有一个web.config文件。Views下的web.config文件只对Views文件夹下面的文件有效。如果你要处理的页面不在Views下面,那么一定要设置在主项目下的web.config中才有用。

所以需要注意的是如果取消了ValidateRequest验证,那么就会丢失安全性,所以在不得已的情况下不要使用,即便要使用也不能使用全局设置的方法,那个页面或者方法需要就在那个屏蔽ValidateRequest验证就好了,千万不要贪图简单,全局设置,这样不是我们做互联网开发的好习惯,当你做大的项目的时候就可能带来严重的损失。

好了,方法都说了,该怎么做就是你自己的选择了,希望此篇博文能帮助到大家

猜你喜欢

转载自blog.csdn.net/iceagezh/article/details/70840304