2009-02-06 28 views
2

我有一個控件,我在寫關於.NET的內置請求驗證,以防止XSS攻擊和類似的錯誤。以編程方式關閉請求驗證

該控件允許網站所有者調整該頁面上的內容。如果他們願意,他們可能會輸入標記。由於它是他們的網站進行編輯,他們必須能夠在那裏粘貼他們想要的任何內容。

我想知道是否有可能以編程方式禁用此驗證?

我能找到的唯一方法是通過在web.config中完全關閉請求驗證或使用頁面指令。出於各種原因,我不能在另一個頁面中使用此控件 - 因此該選項已停用。

回答

2

在System.Web.Configuration

PagesSection pageSection = new PagesSection(); 
pageSection.ValidateRequest = false; 

Reference

+1

你不需要得到實際的配置部分?我需要這樣做來讀取值,否則我只是得到了默認值。雖然(?)可能會有所不同。 var PagesSection = System.Configuration.ConfigurationManager.GetSection(「system.web/pages」)爲PagesSection; – misteraidan 2011-09-13 01:04:07

1

@克里斯導致我在正確的方向。

我所做的是關閉web.config中的設置,並使用HTTP模塊爲用戶不在EditMode中的所有請求執行請求驗證。

在.NET 2.0中,Request類中有一個名爲ValidateInput的方法。即使它在web.config中關閉,也會執行驗證。

3

這裏概述的答案都不夠。由於配置項是隻讀的,因此您首先需要修改它們以便寫入。此外,自.NET 4發佈以來,您還需要修改HttpRuntime.RequestValidationMode屬性,然後才能識別此Pages.ValidateRequest屬性。

public void ModifiyValidation(bool validate) { 

    var pagesSection = System.Configuration.ConfigurationManager.GetSection("system.web/pages") as PagesSection; 
    var httpRuntime = System.Configuration.ConfigurationManager.GetSection("system.web/httpRuntime") as HttpRuntimeSection; 

    if (pagesSection != null && httpRuntime != null && pagesSection.ValidateRequest != validate) 
    { 
     var fi = typeof (ConfigurationElement).GetField("_bReadOnly", BindingFlags.Instance | BindingFlags.NonPublic); 
     fi.SetValue(pagesSection, false); 
     fi.SetValue(httpRuntime, false); 
     pagesSection.ValidateRequest = validate; 
     httpRuntime.RequestValidationMode = new Version(validate ? "4.0" : "2.0"); 
     fi.SetValue(pagesSection, true); 
     fi.SetValue(httpRuntime, true); 
    } 
} 

你也應該知道,只會在激活以下請求。