惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Privacy International News Feed
Martin Fowler
Martin Fowler
D
Docker
Y
Y Combinator Blog
云风的 BLOG
云风的 BLOG
U
Unit 42
T
Tailwind CSS Blog
J
Java Code Geeks
G
Google Developers Blog
MongoDB | Blog
MongoDB | Blog
阮一峰的网络日志
阮一峰的网络日志
WordPress大学
WordPress大学
月光博客
月光博客
大猫的无限游戏
大猫的无限游戏
美团技术团队
F
Fortinet All Blogs
N
News and Events Feed by Topic
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Hacker News - Newest:
Hacker News - Newest: "LLM"
The GitHub Blog
The GitHub Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Recorded Future
Recorded Future
N
Netflix TechBlog - Medium
Google DeepMind News
Google DeepMind News
Hacker News: Ask HN
Hacker News: Ask HN
L
LINUX DO - 最新话题
Microsoft Security Blog
Microsoft Security Blog
N
News and Events Feed by Topic
I
Intezer
TaoSecurity Blog
TaoSecurity Blog
NISL@THU
NISL@THU
小众软件
小众软件
博客园 - 聂微东
博客园 - Franky
有赞技术团队
有赞技术团队
P
Palo Alto Networks Blog
爱范儿
爱范儿
H
Hacker News: Front Page
C
Cyber Attacks, Cyber Crime and Cyber Security
C
Cisco Blogs
P
Proofpoint News Feed
I
InfoQ
Google DeepMind News
Google DeepMind News
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Vercel News
Vercel News
H
Heimdal Security Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
量子位

博客园 - ♂风车车

X509Certificate类解析证书的差异,算是.Net的BUG吗? Ninject 2.x细说---2.绑定和作用域 Ninject 2.x细说---1.基本使用 ASP.NET MVC3---1.入门 删除Windows 7系统保留分区100MB .Net并行编程系列文章导航 Entity Framework系列文章导航 多核时代 .NET Framework 4 中的并行编程9---线程安全集合类 多核时代 .NET Framework 4 中的并行编程8---任务的同步 多核时代 .NET Framework 4 中的并行编程7---任务工厂和任务计划 多核时代 .NET Framework 4 中的并行编程6---并行LINQ 多核时代 .NET Framework 4 中的并行编程5---并行循环Parallel Loop 多核时代 .NET Framework 4 中的并行编程4---异常处理 多核时代 .NET Framework 4 中的并行编程3---任务并行库之Task (下) 多核时代 .NET Framework 4 中的并行编程2---任务并行库之Task (上) 多核时代 .NET Framework 4 中的并行编程1---概述 Entity Framework 4中删除所有数据行的几种方法 ADSL Modern+无线路由实现无线上网 通过代码理解Asp.net4中的几种ClientIDMode设置.
ASP.Net4中实现自定义的请求验证
♂风车车 · 2011-07-20 · via 博客园 - ♂风车车

1.        请求验证什么?

首先,请看下图:

上图中,是我们常见一个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(HttpContext context, string value, RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex)

        {

            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="true" targetFramework="4.0" />

      <httpRuntime requestValidationType="WebApplication1.myRequestValidator" />

    </system.web>

</configuration>

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

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

      

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