2009-02-06 54 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); 
    } 
} 

你也应该知道,只会在激活以下请求。