ASP.Net4中實現自定義的請求驗證

導讀:在.Net4中有個System.Web.Util.RequestValidator類,該類是自定義請求驗證的基類。我們可以通過實現一個繼承自該基類的類,從而實現自己的請求驗證過程,比如對提交的表單數據,查詢字符串等等進行驗證。

1. 請求驗證什麼?

首先,請看下圖:

上圖中,是我們常見一個ASP.Net錯誤提示.由於ASP.Net默認情況是把請求驗證(validateRequest)設置是爲true,從而使得ASP.Net會對提交的信息進行檢查,這在一定程度上有效的阻止了某些危險攻擊,比如:跨站腳本攻擊(XSS/CSS)。

但是,也存在以下問題:

有時候,我們允許用戶輸入某些特殊時,如果按照請求驗證(validateRequest)默認設置true,那麼當用戶輸入我們允許的特殊字符時,就會出現如上圖所示的錯誤提示,阻止了用戶輸入.此時,我們必須將請求驗證設置爲false,才能允許用戶輸入特殊字符。可是,一旦把請求驗證設置爲false,那麼ASP.Net就不會對請求驗證了,這樣其潛在危險就超過了我們的控制範圍.

雖然,我們可以在某些頁面做特殊處理,以便阻止這些潛在的危險.可以,隨着項目擴大,也許要處理的頁面就會增長.顯然,我們需要靈活、方便、更好的方式進行處理.那麼現在在ASP.NET4就爲我們提供了一個可以集中處理的自定義擴展點。

2.RequestValidator

在.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參數設置爲null(Path不是值的集合)。

IsValidRequestString方法的value參數設置爲Path字段的值。

7. PathInfo HTTP PathInfo字符串(URL路徑的擴展)。

IsValidRequestString方法的collectionKey參數設置爲null(PathInfo不是值的集合)。

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爲我們提供很多擴展點,可以很方便進行擴展,使得我們的應用程序更加靈活可控。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章