我有一个控件,我正在编写我想要关闭.NET的内置请求验证,以防止XSS攻击和类似的恶意。
该控件允许网站所有者调整该网页上的内容。如果他们愿意,他们可能会输入标记。由于这是他们的网站编辑,他们必须能够在那里坚持他们想要的任何东西。
我想知道是否可以通过编程方式禁用此验证?
我能找到的唯一方法是通过在web.config中完全关闭请求验证或使用page指令。出于各种原因,我无法在另一个页面中拥有此控件 - 因此选项已经用完。
答案 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;
答案 2 :(得分:1)
我所做的是关闭web.config中的设置,并使用HTTP模块对用户不在EditMode中的所有请求进行请求验证。
在.NET 2.0中,Request类上有一个名为ValidateInput的方法。即使在web.config中关闭它,它也会进行验证。