【问题标题】:Control level ValidateRequestMode has no effect控制级别 ValidateRequestMode 无效
【发布时间】:2014-07-01 06:31:13
【问题描述】:
我正在使用 ASP.NET WebForms (.NET 4.5) 并有一个“内容块”控件,可以在多个页面上重复使用。我已经尝试将控件的 ValidateRequestMode 甚至单个元素设置为“已禁用”,但来自 web.config 的请求验证仍然可以防止不安全的输入。
有没有办法解决这个问题还是我做错了什么?
例子:
【问题讨论】:
标签:
c#
asp.net
.net
webforms
request-validation
【解决方案1】:
经过一上午的反复试验后,我刚刚用下面的代码为一个网站解决了同样的问题 - 微软关于新请求验证过程的文档在涉及 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");
【解决方案2】:
同意杰森·埃尔金的观点。
作为补充,设置ValidateRequestMode="Disabled"后
在 Control 级别,在服务器端,每当访问 Request 时,您必须访问 Request.Unvalidated 以获取值。
【解决方案3】:
此答案将@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 表单的目录的相对路径。