以编程方式关闭请求验证

时间:2009-02-06 10:56:48

标签: c# asp.net security

我有一个控件,我正在编写我想要关闭.NET的内置请求验证,以防止XSS攻击和类似的恶意。

该控件允许网站所有者调整该网页上的内容。如果他们愿意,他们可能会输入标记。由于这是他们的网站编辑,他们必须能够在那里坚持他们想要的任何东西。

我想知道是否可以通过编程方式禁用此验证?

我能找到的唯一方法是通过在web.config中完全关闭请求验证或使用page指令。出于各种原因,我无法在另一个页面中拥有此控件 - 因此选项已经用完。

3 个答案:

答案 0 :(得分: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);
    }
}

您还应该知道,只会在以下请求中激活。

答案 1 :(得分:2)

在System.Web.Configuration

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

Reference

答案 2 :(得分:1)

@Chris带领我朝着正确的方向前进。

我所做的是关闭web.config中的设置,并使用HTTP模块对用户不在EditMode中的所有请求进行请求验证。

在.NET 2.0中,Request类上有一个名为ValidateInput的方法。即使在web.config中关闭它,它也会进行验证。