[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”,如:
<system.web >
<pages validateRequest="false" ></pages >
</system.web >
但这样,整个项目中的所有Form请求都不再验证提交内容的安全性,我本人不提倡这种做法。
二、单个页面设置(推荐)
我们在用Asp.net 开发 Web Form页面时,通常要提交包含Html内容的数据给后台程序代码处理时,会为页面设置 ValidateRequest=”false” 属性,设置后,讨厌的 “从客户端 … 中检测到有潜在危险的 Request.Form 值”的错误就会被屏蔽掉了。
如果你使用的是.NET MVC开发,那么也很简单,只需要在要处理的Action中添加属性[ValidateInput(false)]即可,类似以下:
[ValidateInput(false)]
public ActionResult Index(string value)
{
//Do Something
}
但是如果你使用的是MVC 3.0甚至更低版本,那么你会发现做了以上的设置后还是无效。这是因为你还需要在web.config中做以下设置:
<system.web >
<httpRuntime requestValidationMode="2.0" / >
</system.web >
PS:
如果取消了ValidateRequest验证,那么就会丢失安全性,所以在不得已的情况下不要使用,即便要使用也不能使用全局设置的方法,那个页面或者方法需要就在那个屏蔽ValidateRequest验证就好了,千万不要贪图简单,全局设置,这样不是我们做互联网开发的好习惯,当你做大的项目的时候就可能带来严重的损失。
好了,方法都说了,该怎么做就是你自己的选择了,希望此篇博文能帮助到大家