ValidateRequest =“ false”在Asp.Net 4中不起作用


156

我有使用ckeditor的表格。这种形式在Asp.Net 2.0和3.5上都可以正常工作,但现在在Asp.Net 4+中不起作用。我有ValidateRequest =“ false”指令。有什么建议?


有一篇简短的文章介绍了如果有人愿意的话,如何正确呈现验证控件:.NET 4中的错误验证
Ian 2010年

谁能让我知道使用ValidationRequest = false的缺点吗?
fc123

Answers:


194

在错误页面找到解决方案。只需添加requestValidationMode =“ 2.0”

<system.web>
    <compilation debug="true" targetFramework="4.0" />
    <httpRuntime requestValidationMode="2.0" />
</system.web>

MSDN信息:HttpRuntimeSection.RequestValidationMode属性


1
太棒了,但是有人知道一种为每页设置它的方法吗?另外,如何将其放在web.config中,使其仍可与.NET 2一起使用?
MK。

1
@MK:我认为此设置没有页面指令。您不能使其在.net 2上运行。我认为那不是必需的。因为您只能构建仅针对一个框架版本的Web应用程序。只需将此行复制到需要它的.net 4 web.config即可
HasanG 2010年

2
但是.net 4的验证发生了什么变化?有没有一种方法可以不更改验证模式?
斯莱

4
:@Sly:你可以在这里找到答案asp.net/learn/whitepapers/aspnet4/...
哈桑

谁能让我知道为什么在asp.net 4.0应用程序中使用requestValidationMode =“ 2.0”是个好主意吗?
fc123 2014年

102

有一种方法可以将验证返回到一页的2.0。只需将以下代码添加到您的web.config中:

<configuration>
    <location path="XX/YY">
        <system.web>
            <httpRuntime requestValidationMode="2.0" />
        </system.web>
    </location>

    ...
    the rest of your configuration
    ...

</configuration>

该位置是任何路径,并且基于您在树中指定的文件夹下的任何节点。
DFTR

7
这是一个比公认的答案更好的解决方案,因为它的应用范围并不广泛,而是局限于您在位置路径中定义的特定范围
Charles Wesley

5
上面的<location ..>声明应放在<configuration>声明中,但不能再嵌套。
rbassett '16

1
每页设置似乎不适用于以.NET 4.6.1为目标的项目。
丹尼斯T-恢复莫妮卡

56

我知道这是一个古老的问题,但是如果您在MVC 3中遇到此问题,则可以用来进行修饰ActionMethod[ValidateInput(false)]并且只需关闭单个请求验证即可ActionMethod。而且您不需要对web.config文件进行任何更改,因此您仍然可以在其他地方使用.NET 4请求验证。

例如

[ValidateInput(false)]
public ActionMethod Edit(int id, string value)
{
    // Do your own checking of value since it could contain XSS stuff!
    return View();
}

1
@RossCooper这仅适用于asp.net MVC
mxmissile

28

这无需更改验证模式即可工作。

您必须使用System.Web.Helpers.Validation.Unvalidated来自的帮助程序System.Web.WebPages.dll。它将返回一个UnvalidatedRequestValues对象,该对象无需验证即可访问表单和QueryString。

例如,

var queryValue = Server.UrlDecode(Request.Unvalidated("MyQueryKey"));

适用于MVC3和.NET 4。


1
您能否提供一个使用该方法检索queryString的示例?我不断收到“未验证不是...的成员”,我尝试将其附加到的所有对象。我想我可能会缺少一个include
CodedMonkey,2012年

3
var queryValue = Server.UrlDecode(Request.Unvalidated(“ MyQueryKey”));;
sfuqua

1
这绝对应该是公认的答案。保持安全性,并且非常灵活,因为您可以有选择地使用它。
cmartin

对于Web窗体,您必须替换QueryString集合中的条目以避免验证错误,请参阅当从jquery帖子调用向asp.net页发送html标记时,从客户端检测到潜在危险的Request.QueryString值
Michael Freidgeim,

15

请注意,另一种方法是保持4.0验证行为,但定义派生自RequestValidator并设置的类:

<httpRuntime requestValidationType="YourNamespace.YourValidator" />

(哪里YourNamespace.YourValidator好,您应该可以猜测...)

这样,您可以保留4.0s行为的优点(特别是,验证在处理的早期进行),同时还允许您通过的请求得以通过。


7
很高兴知道。但是我仍然认为ASP.Net的整个请求验证功能都被误导了。输入本身不是问题,这是您使用它所要做的。接受SQL,HTML或JavaScript代码作为应用程序的输入是完全有效的,只要在输出或存储到数据库之前对其进行正确的编码/转义即可。
约旦·里格

2
@JordanRieger我部分同意。OOTB,它至少具有默认安全的优点(不要认为事情会透漏,而会出错,而不是归零),但这有点麻烦,4.0之前的行为是全有或全无。可以像在自定义requestValidationType一样,具有在任何其他处理之前使用的验证层的功能,但是很多验证需要与其他处理紧密结合。总的来说,我认为保护不良习惯的人免受某些(但不是全部)伤害比鼓励良好习惯更多。
乔恩·汉纳
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.