ASP.NET 4.0: 请求验证模式变化导致ValidateRequest=false失效
ASP.NET請求驗證功能可以給我提供應用程序的安全保證,避免站點受到XSS的攻擊。但是在一些情況下,我們需要禁用這個功能,比如我們需要使用HtmlEditor來讓用戶輸入一些HTML文本,這時候ASP.NET 2.0允許我們可以通過在web.config設置validateRequest="false"?;蛘咴贛VC中,我們可以通過在Controller或者Action上設置[ValidateRequest(false)]這個特性來達到禁用的上的。但是在當你把站點從舊版本升級到ASP.NET 4.0后,你會發現,即使你這樣做,仍然會提示你這樣的一個異?!癆 potentially dangerous Request.Form value was detected from the client”。該如何來解決這個問題呢?
在之前的ASP.NET版本中,請求驗證是默認啟用的,但是它只對頁面請求有效(請求.aspx頁面),并且也只是在頁面被請求時驗證。但是在ASP.NET 4.0中,請求驗證功能被提前到IHttpHandler.BeginRequest這個方法被請求之前,這也就意味著所有進入ASP.NET請求通道的所有的HTTP請求都將會被進行請求內容合法性的驗證,包括有的自定義HttpHandler,WebService請求,甚至于利用自定義Http Module進行自定義請求處理程序。
請求驗證處理被提前的后果就是導致我們在頁面,或者Controller中設置ValidateRequest=false,將會失效,無法阻止程序不去驗證請求的輸入內容了。因為這樣做后,驗證器無法得到請求的頁面是否禁用了驗證請求,因為還沒有實例化HttpHandler。并且在ASP.NET4.0中,并沒有提供給我一個地方去禁用這個驗證功能。但是出于兼容性的考慮,ASP.NET允許我們通過在web.config中配置使用ASP.NET 2.0的請求驗證行為:<httpRuntime requestValidationMode=”2.0″ />。
完全禁用或不禁用請求驗證功能,對程序員來說都不是特別方便。出現安全性和程序可用性考慮,一個折中的方案可能是自己寫一個驗證處理器,來過濾掉一些我們不希望出現的html標簽,而不是一見到”<>” 就害怕。因為XSS的一個很重要的標簽是<script> ,那我們就可以通過寫一個自定義的驗證來過濾<script>,當看到用戶提交這個標簽就才報告非法輸入,下面是一個示例源碼:
以上段落可能會引起關于如何防止XSS攻擊的歧義,特此刪除。以下代碼僅用于演示開發人員如何編寫自定義的請求輸入驗證器,根據自己需要決定允許請求哪些數據:
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;
}
}
}
} 此時,我們在web.config中添加這個配置,讓系統使用我們的自定義驗證器進行驗證:<httpRuntime requestValidationType=”Globals.CustomRequestValidation”/>。
關于這個問題的相關資源:
http://jefferytay.wordpress.com/2010/04/15/asp-net-4-breaking-changes-1-requestvalidationmode-cause-validaterequestfalse-to-fail/
轉載于:https://www.cnblogs.com/hjf1223/archive/2010/04/17/asp_net_4_breaking_change_validatereqeust.html
總結
以上是生活随笔為你收集整理的ASP.NET 4.0: 请求验证模式变化导致ValidateRequest=false失效的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Flash气泡回弹效果
- 下一篇: 通下水道多少钱啊?