代码改变世界

勤于思考:从客户端中检测到有潜在危险的 Request.Form 值

2013-06-03 17:07  薛凯凯圆滚滚  阅读(313)  评论(0编辑  收藏  举报

在提交表单时候,asp.net 提示:"从客户端(......)中检测到有潜在危险的 Request.Form 值" 。

asp.net中的请求验证特性提供了某一等级的保护措施防止XSS攻击,asp.net的请求验证是默认启动的。

看看网络上的搜索的到解决方案。这里我主要说MVC3,4.0。

1、 在Controller调用的方法上添加[ValidateInput(false)]

[ValidateInput(false)]

2、 在web.config修改一处配置

<httpRuntime requestValidationMode="2.0"/>

requestValidationMode 有两个值:

2.0仅对网页启用请求验证。是启用还是关闭取决于 validateRequest。

4.0 默认值。任何 HTTP 请求都会启用请求验证,也就是说不光是网页,还包括 Cookie 等。此时强制启用,不管 validateRequest 为何值。

由于 requestValidationMode="4.0" 是强制启用,所以我们会发现在 .NET Framework 4.0 中仅靠设置 validateRequest 是关闭不了请求验证的,还得将 requestValidationMode 设置为 2.0。

ASP.NET中的请求验证特性提供了某一等级的保护措施防止XSS攻击,之前版本的ASP.NET的请求验证是默认启动的,但是他紧紧应用于ASP.NET页面中(.aspx文件和.aspx.cs文件)。

而在ASP.NET4中,请求验证默认对所有类型的请求启动,因为它在BeginRequest被调用之前启动,结果就是对所有资源的请求都要经过请求验证,而不仅仅在.aspx文件和他们的类文件中,甚至包括web service和自定义的httphandler。

同样,在自定义httpmodules读取http请求的时候,同样要经过请求验证。

这是ASP.Net提供的一个很重要的安全特性。因为很多程序员对安全没有概念,甚至都不知道XSS这种攻击的存在,知道主动去防护的就更少了。

ASP.Net在这一点上做到默认安全。这样让对安全不是很了解的程序员依旧可以写出有一定安全防护能力的网站。

但是往往我们需要添加富客户端编辑器的时候是肯定会返回HTML标签的~

看到的解决方案最后也是去掉,但是我觉得自定义验证更合适。

我的想法是新建一个类,继承该验证类验证前,先过滤Html标签和脚本标签等

然后再把值丢给原来的验证先让它Pass,不再抛异常,到了Controlle在进行处理!

这样的话就可以保留大多数的验证,而不是遇到这个我就设置2.0然后关闭验证等。

using Education.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Util;

namespace Education.Web.Models
{
    public class GlobalRequestValidation : RequestValidator
    {
        public GlobalRequestValidation() 
        { 
        
        }

        protected override bool IsValidRequestString(HttpContext context, string value, RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex)
        {
            string val = Utils.RemoveHTMLStr(value);
            bool isPass = base.IsValidRequestString(context, val, requestValidationSource, collectionKey, out validationFailureIndex);
            return isPass;
        }
    }
}