ASP.Net4中实现自定义的请求验证

简介:

.        请求验证什么?

首先,请看下图:

 

上图中,是我们常见一个ASP.Net错误提示.由于ASP.Net默认情况是把请求验证(validateRequest)设置是为true,从而使得ASP.Net会对提交的信息进行检查,这在一定程度上有效的阻止了某些危险攻击,比如: 跨站脚本攻击(XSS/CSS).

但是,也存在以下问题:

有时候,我们允许用户输入某些特殊时,如果按照请求验证(validateRequest)默认设置true,那么当用户输入我们允许的特殊字符时,就会出现如上图所示的错误提示,阻止了用户输入.此时,我们必须将请求验证设置为false,才能允许用户输入特殊字符可是,一旦把请求验证设置为false,那么ASP.Net就不会对请求验证了,这样其潜在危险就超过了我们的控制范围.

虽然,我们可以在某些页面做特殊处理,以便阻止这些潜在的危险.可以,随着项目扩大,也许要处理的页面就会增长.显然,我们需要灵活、方便、更好的方式进行处理.

2.        RequestValidator

那么现在在ASP.NET4就为我们提供了一个可以集中处理的自定义扩展点.

.Net4中有个System.Web.Util.RequestValidator,该类是自定义请求验证的基类.我们可以通过实现一个继承自该基类的类,从而实现自己的请求验证过程.

目前,可以验证的请求由枚举类RequestValidatorSource提供,可枚举项具体如下:

1.        QueryString 查询字符串。

IsValidRequestString 方法的 collectionKey 参数设置为集合中查询字符串参数的名称。

IsValidRequestString 方法的 value 参数设置为集合中查询字符串参数的值。

 

2.         Form 窗体值。

IsValidRequestString 方法的 collectionKey 参数设置为集合中窗体参数的名称。

IsValidRequestString 方法的 value 参数设置为集合中窗体参数的值。

 

3.         Cookies 请求 Cookie

IsValidRequestString 方法的 collectionKey 参数设置为集合中的 Cookie 的名称。

IsValidRequestString 方法的 value 参数设置为集合中的值。

 

4.         Files 上载的文件。

IsValidRequestString 方法的 collectionKey 参数设置为集合中已上载文件的名称。

IsValidRequestString 方法的 value 参数设置为集合中已上载文件的值。

 

5.         RawUrl 原始 URL (域后的 URL 部分。)

IsValidRequestString 方法的 collectionKey 参数设置为 null RawUrl 不是值集合。)

IsValidRequestString 方法的 value 参数设置为 RawUrl 字段的值。

 

6.         Path 虚拟路径。

IsValidRequestString 方法的 collectionKey 参数设置为 nullPath 不是值的集合)。

IsValidRequestString 方法的 value 参数设置为 Path 字段的值。

 

7.         PathInfo HTTP PathInfo 字符串(URL 路径的扩展)。

IsValidRequestString 方法的 collectionKey 参数设置为 nullPathInfo 不是值的集合)。

IsValidRequestString 方法的 value 参数设置为 PathInfo 字段的值。

 

8.         Headers 请求标头。

IsValidRequestString 方法的 collectionKey 参数设置为集合中 HTTP 头的名称。

IsValidRequestString 方法的 value 参数设置为集合中 HTTP 头的值。

 

通过以上这些枚举我们基本上就能对常见提交的数据进行统一请求验证处理,比如:忽略某些特殊的数据或者处理某些特殊的数据或者提供一个友好的错误页面等。

3.        实现自定义请求验证

下面演示如何实现一个自定义验证类,对每个查询字符串验证.步骤如下:

1)     继承RequestValidator,只需要重写IsValidRequestString方法,如下:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.Util;

namespace WebApplication1

{

    public class myRequestValidator:RequestValidator

    {

 

        protected override bool IsValidRequestString(HttpContextcontext, string value, RequestValidationSourcerequestValidationSource, string collectionKey, out intvalidationFailureIndex)

        {

            validationFailureIndex = -1;

            if (requestValidationSource ==RequestValidationSource.QueryString) //对查询字符串进行验证

            {

                if (value.Contains("<"))//检查是否包含<,当然也可以检查其他特殊符号,或者忽略某些特殊符号.

                {

                    context.Response.Redirect("~/Error.aspx",true);//直接转到自定义的错误页面.

                    return false;

                }

 

            }

            return base.IsValidRequestString(context, value, requestValidationSource, collectionKey, out validationFailureIndex);

        }

    }

}

 

2)     web.config中设置请求验证类型为自定义的类型.如下:

<configuration>

    <system.web>

        <compilation debug="truetargetFramework="4.0" />

      <httpRuntimerequestValidationType="WebApplication1.myRequestValidator" />

    </system.web>

</configuration>

 

现在,我们通过修改url来提交带<特殊符号的页面时,将会被定向到自定义的错误页面,而不是默认错误提示.如下:

 

如下图所示,并没有出现默认的错误提示,而是到了我们自己提供一个错误页面。

 

       

最后,ASP.Net4为我们提供很多扩展点,可以很方便进行扩展,使得我们的应用程序更加灵活可控。



    本文转自风车车  博客园博客,原文链接:http://www.cnblogs.com/xray2005/archive/2011/07/20/2111185.html,如需转载请自行联系原作者




相关文章
|
6月前
|
开发框架 JSON .NET
ASP.NET Core 自定义配置警告信息
自定义配置警告信息需要在 startup 类中的 ConfigureService 方法中进行配置示例: // 注册 控制器服务 services.AddControllers(configure: setup => { setup.ReturnHttpNotAcceptable = true; ...
43 0
|
7月前
|
XML 存储 JSON
使用自定义XML配置文件在.NET桌面程序中保存设置
本文将详细介绍如何在.NET桌面程序中使用自定义的XML配置文件来保存和读取设置。除了XML之外,我们还将探讨其他常见的配置文件格式,如JSON、INI和YAML,以及它们的优缺点和相关的NuGet类库。最后,我们将重点介绍我们为何选择XML作为配置文件格式,并展示一个实用的示例。
96 0
|
4月前
|
XML API 数据库
七天.NET 8操作SQLite入门到实战 - 第六天后端班级管理相关接口完善和Swagger自定义配置
七天.NET 8操作SQLite入门到实战 - 第六天后端班级管理相关接口完善和Swagger自定义配置
|
5月前
|
Windows
基于.Net Core实现自定义皮肤WidForm窗口
基于.Net Core实现自定义皮肤WidForm窗口
49 0
|
7月前
|
存储
.NET Core - 自定义配置数据源:低成本实现定制化配置方案
.NET Core - 自定义配置数据源:低成本实现定制化配置方案
|
7月前
.NET Core-自定义配置数据源
前面,我们学习了配置框架的4种配置方式,那么你知道如何实现自定义的配置数据源吗?知道如何低成本实现定制化配置方案吗?下面我们就一起来学习一下吧。
|
9月前
|
开发框架 JSON 算法
ASP.NET Core Web API之Token验证
ASP.NET Core Web API之Token验证
145 0
|
10月前
|
C#
.NET Core反射获取带有自定义特性的类,通过依赖注入根据Attribute元数据信息调用对应的方法
.NET Core反射获取带有自定义特性的类,通过依赖注入根据Attribute元数据信息调用对应的方法
122 0
|
开发框架 中间件 .NET
asp.net core 自定义中间件【以dapper为例】
asp.net core 自定义中间件【以dapper为例】
126 0
|
编解码 分布式计算 Java
基于 netty 封装的超简单通俗易用 服务端客户端交互框架 《net-framework》原理,源码和使用说明,开箱即用,只需要开发业务逻辑,完全自定义无限扩充 [结尾附github源码]
基于 netty 封装的超简单通俗易用 服务端客户端交互框架 《net-framework》原理,源码和使用说明,开箱即用,只需要开发业务逻辑,完全自定义无限扩充 [结尾附github源码]
基于 netty 封装的超简单通俗易用 服务端客户端交互框架 《net-framework》原理,源码和使用说明,开箱即用,只需要开发业务逻辑,完全自定义无限扩充 [结尾附github源码]