首页 > 代码库 > 警惕ASP.NET MVC中的ValidateInputAttribute

警惕ASP.NET MVC中的ValidateInputAttribute

最近在做一个ASP.NET MVC项目的时候发现,有一个Controller的Action死活都没法接收到从客户端提交过来的Html表单请求和数据,后来才发现是因为默认情况下ASP.NET MVC在执行Controller的代码前,会对客户端提交到服务器的数据做安全性验证,如果ASP.NET检测到客户端提交的数据中有危险数据(危险数据一般是一些关键字和关键符号),那么就会中断当前客户端提交的请求并且引发一个异常,那么客户端提交的数据自然就不会进入到Controller和Action了。主要原因是在该项目中有页面使用了富文本编辑器,而用户在富文本编辑器中输入的文字实际上是Html,所以当富文本编辑器的数据提交到服务器端后,ASP.NET认为客户端提交的数据中包含大量Html标签是危险数据,请求直接就被终止了,然后抛出异常。其实这个问题不光在ASP.NET MVC中存在,在WebForm中也是有数据安全性验证的,而且MVC和WebForm的数据安全性验证是可以通过设置来关闭的,详情请接着往下看。

 

后来才知道,原来在ASP.NET MVC中有一个叫ValidateInputAttribute的Filter可以关闭数据安全性验证,将其加到接收数据的Action上后,客户端富文本编辑器的数据就能成功传入Action了,如下所示传入参数false就告诉ASP.NET不要对这个Action做数据安全性验证。 

 

技术分享

 

下面是对MVC系统自带常用的几个Filter的介绍,其中就有ValidateInputAttribute

名称说明
OutputCacheAttribute 类似于 Web Form中在 OutputCache 指令。 OutputCache 属性允许在 MVC Framework 缓存控制器的输出。
ValidateInputAttribute 

类似于 Web Form中 ValidateRequest 属性。 MVC 框架默认将为 检查HTML 或其他危险输入传入的 HTTP 请求。 如果检测到,将引发异常。 使用此属性可以禁用请求验证。

AuthorizeAttributeAuthorize 属性,可以对控制器操做的声明性的授权检查。 该属性可以限制特定角色中的用户的操作。 当您创建只应该给管理员角色中的用户的操作时,您可以使用此属性。默认使用的ASP.NET Membership服务,如果不使用ASP.NET 的Membership服务,可以继承AuthorizeAttribute,重写实现。
ValidateAntiForgeryTokenAttribute此属性是一个解决方案以帮助防止跨站点的请求攻击 (CSRF)。 它允许验证的 HTTP POST 为特定于用户的标记在 Framework。 有关详细信息 CSRFs,请参阅" 使用 ASP.NET MVC AntiForgeryToken() 帮助器防止跨站点请求伪造 (CSFR)."

警惕ASP.NET MVC中的ValidateInputAttribute