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

  • Post author:
  • Post category:其他


当制作网页的时候,提交的数据有特殊字符或者是提交富文本编辑器数据的时候,经常会遇到这样的错误:
[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:
如果你遇到MVC.NET解决validateRequest设置为false不起作用,看看是不是因为这个原因,在MVC项目中,Views文件夹下与主项目下,都会有一个web.config文件。Views下的web.config文件只对Views文件夹下面的文件有效。如果你要处理的页面不在Views下面,那么一定要设置在主项目下的web.config中才有用。

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

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



版权声明:本文为iceagezh原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。