ASP.NET 4.0: 请求验证模式变化导致ValidateRequest=false失效
ASP.NET請(qǐng)求驗(yàn)證功能可以給我提供應(yīng)用程序的安全保證,避免站點(diǎn)受到XSS的攻擊。但是在一些情況下,我們需要禁用這個(gè)功能,比如我們需要使用HtmlEditor來(lái)讓用戶輸入一些HTML文本,這時(shí)候ASP.NET 2.0允許我們可以通過(guò)在web.config設(shè)置validateRequest="false"。或者在MVC中,我們可以通過(guò)在Controller或者Action上設(shè)置[ValidateRequest(false)]這個(gè)特性來(lái)達(dá)到禁用的上的。但是在當(dāng)你把站點(diǎn)從舊版本升級(jí)到ASP.NET 4.0后,你會(huì)發(fā)現(xiàn),即使你這樣做,仍然會(huì)提示你這樣的一個(gè)異常“A potentially dangerous Request.Form value was detected from the client”。該如何來(lái)解決這個(gè)問(wèn)題呢?
在之前的ASP.NET版本中,請(qǐng)求驗(yàn)證是默認(rèn)啟用的,但是它只對(duì)頁(yè)面請(qǐng)求有效(請(qǐng)求.aspx頁(yè)面),并且也只是在頁(yè)面被請(qǐng)求時(shí)驗(yàn)證。但是在ASP.NET 4.0中,請(qǐng)求驗(yàn)證功能被提前到IHttpHandler.BeginRequest這個(gè)方法被請(qǐng)求之前,這也就意味著所有進(jìn)入ASP.NET請(qǐng)求通道的所有的HTTP請(qǐng)求都將會(huì)被進(jìn)行請(qǐng)求內(nèi)容合法性的驗(yàn)證,包括有的自定義HttpHandler,WebService請(qǐng)求,甚至于利用自定義Http Module進(jìn)行自定義請(qǐng)求處理程序。
請(qǐng)求驗(yàn)證處理被提前的后果就是導(dǎo)致我們?cè)陧?yè)面,或者Controller中設(shè)置ValidateRequest=false,將會(huì)失效,無(wú)法阻止程序不去驗(yàn)證請(qǐng)求的輸入內(nèi)容了。因?yàn)檫@樣做后,驗(yàn)證器無(wú)法得到請(qǐng)求的頁(yè)面是否禁用了驗(yàn)證請(qǐng)求,因?yàn)檫€沒有實(shí)例化HttpHandler。并且在ASP.NET4.0中,并沒有提供給我一個(gè)地方去禁用這個(gè)驗(yàn)證功能。但是出于兼容性的考慮,ASP.NET允許我們通過(guò)在web.config中配置使用ASP.NET 2.0的請(qǐng)求驗(yàn)證行為:<httpRuntime requestValidationMode=”2.0″ />。
完全禁用或不禁用請(qǐng)求驗(yàn)證功能,對(duì)程序員來(lái)說(shuō)都不是特別方便。出現(xiàn)安全性和程序可用性考慮,一個(gè)折中的方案可能是自己寫一個(gè)驗(yàn)證處理器,來(lái)過(guò)濾掉一些我們不希望出現(xiàn)的html標(biāo)簽,而不是一見到”<>” 就害怕。因?yàn)閄SS的一個(gè)很重要的標(biāo)簽是<script> ,那我們就可以通過(guò)寫一個(gè)自定義的驗(yàn)證來(lái)過(guò)濾<script>,當(dāng)看到用戶提交這個(gè)標(biāo)簽就才報(bào)告非法輸入,下面是一個(gè)示例源碼:
以上段落可能會(huì)引起關(guān)于如何防止XSS攻擊的歧義,特此刪除。以下代碼僅用于演示開發(fā)人員如何編寫自定義的請(qǐng)求輸入驗(yàn)證器,根據(jù)自己需要決定允許請(qǐng)求哪些數(shù)據(jù):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Util;namespace Globals
{
/// <summary>
/// Summary description for CustomRequestValidation
/// </summary>
public class CustomRequestValidation : RequestValidator
{
public CustomRequestValidation() { }
protected override bool IsValidRequestString(HttpContext context, string value, RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex)
{
//block script tags
var idx = value.ToLower().IndexOf(“<script”);
if (idx > -1)
{
validationFailureIndex = idx;
return false;
}
else
{
validationFailureIndex = 0;
return true;
}
}
}
} 此時(shí),我們?cè)趙eb.config中添加這個(gè)配置,讓系統(tǒng)使用我們的自定義驗(yàn)證器進(jìn)行驗(yàn)證:<httpRuntime requestValidationType=”Globals.CustomRequestValidation”/>。
關(guān)于這個(gè)問(wèn)題的相關(guān)資源:
http://jefferytay.wordpress.com/2010/04/15/asp-net-4-breaking-changes-1-requestvalidationmode-cause-validaterequestfalse-to-fail/
轉(zhuǎn)載于:https://www.cnblogs.com/hjf1223/archive/2010/04/17/asp_net_4_breaking_change_validatereqeust.html
總結(jié)
以上是生活随笔為你收集整理的ASP.NET 4.0: 请求验证模式变化导致ValidateRequest=false失效的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Flash气泡回弹效果
- 下一篇: [Ubuntu] 安装/卸载 声卡驱动