導(dǎo)讀:在.Net4中有個(gè)System.Web.Util.RequestValidator類,該類是自定義請(qǐng)求驗(yàn)證的基類。我們可以通過(guò)實(shí)現(xiàn)一個(gè)繼承自該基類的類,從而實(shí)現(xiàn)自己的請(qǐng)求驗(yàn)證過(guò)程,比如對(duì)提交的表單數(shù)據(jù),查詢字符串等等進(jìn)行驗(yàn)證。
1. 請(qǐng)求驗(yàn)證什么?
首先,請(qǐng)看下圖:
上圖中,是我們常見(jiàn)一個(gè)ASP.Net錯(cuò)誤提示.由于ASP.Net默認(rèn)情況是把請(qǐng)求驗(yàn)證(validateRequest)設(shè)置是為true,從而使得ASP.Net會(huì)對(duì)提交的信息進(jìn)行檢查,這在一定程度上有效的阻止了某些危險(xiǎn)攻擊,比如:跨站腳本攻擊(XSS/CSS)。
但是,也存在以下問(wèn)題:
有時(shí)候,我們?cè)试S用戶輸入某些特殊時(shí),如果按照請(qǐng)求驗(yàn)證(validateRequest)默認(rèn)設(shè)置true,那么當(dāng)用戶輸入我們?cè)试S的特殊字符時(shí),就會(huì)出現(xiàn)如上圖所示的錯(cuò)誤提示,阻止了用戶輸入.此時(shí),我們必須將請(qǐng)求驗(yàn)證設(shè)置為false,才能允許用戶輸入特殊字符。可是,一旦把請(qǐng)求驗(yàn)證設(shè)置為false,那么ASP.Net就不會(huì)對(duì)請(qǐng)求驗(yàn)證了,這樣其潛在危險(xiǎn)就超過(guò)了我們的控制范圍.
雖然,我們可以在某些頁(yè)面做特殊處理,以便阻止這些潛在的危險(xiǎn).可以,隨著項(xiàng)目擴(kuò)大,也許要處理的頁(yè)面就會(huì)增長(zhǎng).顯然,我們需要靈活、方便、更好的方式進(jìn)行處理.那么現(xiàn)在在ASP.NET4就為我們提供了一個(gè)可以集中處理的自定義擴(kuò)展點(diǎn)。
2.RequestValidator
在.Net4中有個(gè)System.Web.Util.RequestValidator類,該類是自定義請(qǐng)求驗(yàn)證的基類.我們可以通過(guò)實(shí)現(xiàn)一個(gè)繼承自該基類的類,從而實(shí)現(xiàn)自己的請(qǐng)求驗(yàn)證過(guò)程.
目前,可以驗(yàn)證的請(qǐng)求由枚舉類RequestValidatorSource提供,可枚舉項(xiàng)具體如下:
1. QueryString 查詢字符串。
IsValidRequestString方法的collectionKey參數(shù)設(shè)置為集合中查詢字符串參數(shù)的名稱。
IsValidRequestString方法的value參數(shù)設(shè)置為集合中查詢字符串參數(shù)的值。
2. Form窗體值
IsValidRequestString方法的collectionKey參數(shù)設(shè)置為集合中窗體參數(shù)的名稱。
IsValidRequestString方法的value參數(shù)設(shè)置為集合中窗體參數(shù)的值。
3. Cookies請(qǐng)求Cookie。
IsValidRequestString方法的collectionKey參數(shù)設(shè)置為集合中的Cookie的名稱。
IsValidRequestString方法的value參數(shù)設(shè)置為集合中的值。
4.Files上載的文件。
IsValidRequestString方法的collectionKey參數(shù)設(shè)置為集合中已上載文件的名稱。
IsValidRequestString方法的value參數(shù)設(shè)置為集合中已上載文件的值。
5. RawUrl原始URL。(域后的URL部分。)
IsValidRequestString方法的collectionKey參數(shù)設(shè)置為null。(RawUrl不是值集合。)
IsValidRequestString方法的value參數(shù)設(shè)置為RawUrl字段的值。
6. Path虛擬路徑。
IsValidRequestString方法的 collectionKey參數(shù)設(shè)置為null(Path不是值的集合)。
IsValidRequestString方法的value參數(shù)設(shè)置為Path字段的值。
7. PathInfo HTTP PathInfo字符串(URL路徑的擴(kuò)展)。
IsValidRequestString方法的collectionKey參數(shù)設(shè)置為null(PathInfo不是值的集合)。
IsValidRequestString方法的value參數(shù)設(shè)置為PathInfo字段的值。
8.Headers請(qǐng)求標(biāo)頭。
IsValidRequestString方法的collectionKey參數(shù)設(shè)置為集合中HTTP頭的名稱。
IsValidRequestString方法的value參數(shù)設(shè)置為集合中HTTP頭的值。
通過(guò)以上這些枚舉我們基本上就能對(duì)常見(jiàn)提交的數(shù)據(jù)進(jìn)行統(tǒng)一請(qǐng)求驗(yàn)證處理,比如:忽略某些特殊的數(shù)據(jù)或者處理某些特殊的數(shù)據(jù)或者提供一個(gè)友好的錯(cuò)誤頁(yè)面等。
3.實(shí)現(xiàn)自定義請(qǐng)求驗(yàn)證
下面演示如何實(shí)現(xiàn)一個(gè)自定義驗(yàn)證類,對(duì)每個(gè)查詢字符串驗(yàn)證.步驟如下:
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) //對(duì)查詢字符串進(jìn)行驗(yàn)證 { if (value.Contains("<"))//檢查是否包含<,當(dāng)然也可以檢查其他特殊符號(hào),或者忽略某些特殊符號(hào). { context.Response.Redirect("~/Error.aspx",true);//直接轉(zhuǎn)到自定義的錯(cuò)誤頁(yè)面. return false; } } return base.IsValidRequestString(context, value, requestValidationSource, collectionKey, out validationFailureIndex); } } } |
2.在web.config中設(shè)置請(qǐng)求驗(yàn)證類型為自定義的類型.如下: <configuration>
<system.web> <compilation debug="true" targetFramework="4.0" /> <httpRuntime requestValidationType="WebApplication1.myRequestValidator" /> </system.web> </configuration> |
現(xiàn)在,我們通過(guò)修改url來(lái)提交帶<特殊符號(hào)的頁(yè)面時(shí),將會(huì)被定向到自定義的錯(cuò)誤頁(yè)面,而不是默認(rèn)錯(cuò)誤提示.如下:
如下圖所示,并沒(méi)有出現(xiàn)默認(rèn)的錯(cuò)誤提示,而是到了我們自己提供一個(gè)錯(cuò)誤頁(yè)面
最后,ASP.Net4為我們提供很多擴(kuò)展點(diǎn),可以很方便進(jìn)行擴(kuò)展,使得我們的應(yīng)用程序更加靈活可控
文章轉(zhuǎn)載于:http://www.ebrun.com/20160810/186482.shtml
聲明:本網(wǎng)部份文章為轉(zhuǎn)載文章,在每篇文章底部有說(shuō)明,文章的觀點(diǎn)和立場(chǎng)僅代表作者個(gè)人立場(chǎng),不代表微網(wǎng)立場(chǎng),若是文章轉(zhuǎn)載中有侵范您的權(quán)益,請(qǐng)發(fā)郵件到 493149@qq.com或致電13922854199通知?jiǎng)h除,謝謝!
免費(fèi)電話 免費(fèi)熱線:400-830-8248
微信咨詢
注冊(cè)開(kāi)店