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

Has*_*anG 154 asp.net asp.net-4.0 validate-request

我有一个表格,我使用ckeditor.这种形式在Asp.Net 2.0和3.5上运行良好,但现在它在Asp.Net 4+中不起作用.我有ValidateRequest ="false"指令.有什么建议?

Has*_*anG 192

在错误页面找到解决方案.只需要添加requestValidationMode ="2.0"

<system.web>
    <compilation debug="true" targetFramework="4.0" />
    <httpRuntime requestValidationMode="2.0" />
</system.web>
Run Code Online (Sandbox Code Playgroud)

MSDN信息:HttpRuntimeSection.RequestValidationMode属性

  • @Sly:你可以在这里找到答案:http://www.asp.net/learn/whitepapers/aspnet4/breaking-changes#0.1__Toc256770147 (4认同)
  • 太棒了,但是有人知道每页设置这个的方法吗?另外,我如何将其放入 web.config 中,以便它仍然可以与 .NET 2 一起使用? (2认同)
  • 但是.net 4验证的变化是什么?有没有办法在不改变验证模式的情况下做到这一点? (2认同)

Ben*_*man 100

有一种方法可以将验证恢复为一页的2.0.只需将以下代码添加到您的web.config:

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

    ...
    the rest of your configuration
    ...

</configuration>
Run Code Online (Sandbox Code Playgroud)

  • 这是一个比接受的答案更好的解决方案,因为它不适用于您在位置路径中定义的特定范围的应用范围 (7认同)
  • 上面的<location ..>声明应放在<configuration>声明中,但不能再嵌套. (5认同)

Tom*_*ler 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();
}
Run Code Online (Sandbox Code Playgroud)


Ass*_*sin 28

这不会改变验证模式.

你必须使用一个System.Web.Helpers.Validation.Unvalidated帮手System.Web.WebPages.dll.它将返回一个UnvalidatedRequestValues允许访问表单和QueryString而无需验证的对象.

例如,

var queryValue = Server.UrlDecode(Request.Unvalidated("MyQueryKey"));
Run Code Online (Sandbox Code Playgroud)

适用于MVC3和.NET 4.

  • var queryValue = Server.UrlDecode(Request.Unvalidated("MyQueryKey")); (3认同)

Jon*_*nna 15

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

<httpRuntime requestValidationType="YourNamespace.YourValidator" />
Run Code Online (Sandbox Code Playgroud)

(哪里YourNamespace.YourValidator好,你应该猜到......)

这样,您可以保持4.0s行为的优势(特别是,验证在处理中更早发生),同时还允许您需要通过的请求.

  • 这很好知道.但我仍然认为ASP.Net的整个请求验证功能是错误的.输入本身不是问题,而是你用它做*.接受SQL,HTML或JavaScript代码作为应用程序的输入是完全有效的,只要您在输出或将其存储在数据库中之前正确编码/转义它. (7认同)
  • @JordanRieger我部分同意.OOTB,它至少具有默认安全的优势(不要考虑事情,你得到错误,而不是错误),但它有点令人讨厌,4.0之前的行为是非常全有或全无.有一些能够在任何其他处理之前使用验证层,就像自定义requestValidationType一样,但是许多验证需要与其他处理更紧密地联系在一起.总而言之,我认为保护一些(但不是全部)不良习惯的人比鼓励良好的习惯更能保护他们. (2认同)