我正在使用 ASP.NET WebForms (.NET 4.5) 并有一个“内容块”控件,可以在多个页面上重复使用。我尝试将控件的 ValidateRequestMode 甚至单个元素设置为“已禁用”,但是来自 web.config 的请求验证仍然可以防止不安全的输入。
有没有办法解决这个问题或者我做错了什么?
例子:
我正在使用 ASP.NET WebForms (.NET 4.5) 并有一个“内容块”控件,可以在多个页面上重复使用。我尝试将控件的 ValidateRequestMode 甚至单个元素设置为“已禁用”,但是来自 web.config 的请求验证仍然可以防止不安全的输入。
有没有办法解决这个问题或者我做错了什么?
例子:
经过一上午的反复试验后,我刚刚用下面的代码为一个网站解决了同样的问题——微软关于新请求验证过程的文档在涉及 WebForms 时似乎是错误的。
在 web.config 中定位 .NET 4.5,如下所示:
<httpRuntime targetFramework="4.5" requestValidationMode="4.5" />
然后添加ValidateRequestMode="Disabled"
到输入控件本身,即:
<asp:textbox id="myControl" runat="server" ValidateRequestMode="Disabled"/>
如果您直接访问 POST 数据(而不是通过 myControl.Text),那么您还需要绕过验证:
Request.Unvalidated.Form("myControl");
这个答案将@Jason Elkin 的上述答案扩展到 .NET Framework 4.8,并将其宽松的安全范围限制在特定目录。正如之前报道
ValidateRequestMode="Disabled"
的那样,它本身对我不起作用。起作用的是将以下内容插入到我的 ASP.NET 应用程序项目 Web.config 文件中:
<location path="pages/ajax">
<system.web>
<!-- enable AJAX -->
<xhtmlConformance mode="Strict" />
<!-- this allows HTML content to post back when control's ValidateRequestMode="Disabled" -->
<httpRuntime targetFramework="4.8" requestValidationMode="4.8" />
</system.web>
</location>
其中"pages/ajax"
是从 web.config 目录到包含发布 HTML 输入的 Web 表单的目录的相对路径。
同意杰森埃尔金的观点。
作为补充,在设置ValidateRequestMode="Disabled"
控制级别后,在服务器端,每当访问Request时,您必须访问Request.Unvalidated来获取值。