如何在ASP.NET WebAPI中覆盖RequestValidation

时间:2012-03-14 08:28:54

标签: asp.net-web-api request-validation

我遇到包含“危险字符”作为Web API网址一部分的请求时出现问题。网址包括&这是正确的Url编码,但仍然导致请求验证ASP.NET错误。

与MVC不同,似乎没有[ValidateInput(false)]属性来强制和禁用此功能。

4 个答案:

答案 0 :(得分:8)

原来答案是在web.config中使用:

执行此操作
<system.web>
  <httpRuntime requestPathInvalidCharacters="" />  
</system.web>

您可以在全局或子目录级别设置此项。您可以利用<location path="">元素仅在某些路径下指定此设置。例如,如果受影响的Web API路由位于 api / images 下面,则可以执行以下操作:

<location path="api/images">
  <system.web>
    <httpRuntime requestPathInvalidCharacters="" />  
  </system.web>
</location>

更多信息:https://msdn.microsoft.com/en-us/library/e1f13641(v=vs.100).aspx

答案 1 :(得分:2)

在配置中将RequestValidation设置为4.0,答案为否。但是,您可以恢复为2.0请求验证,在这种情况下,MVC属性可以正常工作:默认情况下验证并在需要时显式覆盖。

<httpRuntime executionTimeout="300" requestValidationMode="2.0" />

详细讨论了这个和一些选项: http://www.west-wind.com/weblog/posts/2010/Aug/19/RequestValidation-Changes-in-ASPNET-40

答案 2 :(得分:2)

通过将requestValidationType元素的httpRuntime属性设置为继承自System.Web.Util.RequestValidator并覆盖IsValidRequestString的自定义类型,您可以对此进行更细粒度的控制。

不幸的是,这不是WebAPI管道的一部分,因此无法直接检查操作过滤器(即控制器方法的属性)等内容。

但是,如果您特别关注“表单验证”字段,则在您访问它们之前不会调用验证程序,这会在触发“操作过滤器”后发生,因此您可以选择退出验证通过创建类似以下的类来进行属性...

public class AllowFormHtmlAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        HttpContext.Current.Items["AllowFormHtml"] = true;
    }
}

public class CustomRequestValidator : RequestValidator
{
    protected override bool IsValidRequestString(HttpContext context, string value, RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex)
    {
        if (context.Items["AllowFormHtml"] as bool? == true && requestValidationSource == RequestValidationSource.Form)
        {
            validationFailureIndex = 0;
            return true;
        }

        return base.IsValidRequestString(
            context, value, requestValidationSource, collectionKey, out validationFailureIndex);
    }
}

...然后只使用[AllowFormHtml]

注释您的控制器方法

但是,如果您直接从HttpRequest访问表单字段,则使用HttpRequest.Unvalidated会更简单,这会绕过验证。

答案 3 :(得分:1)

每个@Levi我们的网络安全人员:

配置是唯一的方法。甚至MVC的 [ValidateInput(false)]也无助于这种特殊情况。

Web.config 中禁用它不是一个可怕的想法。如果您通过验证和编码不受信任的数据来遵循良好的安全实践,那么在应用程序范围内应用它是完全正确的。