Как переопределить RequestValidation в ASP.NET WebAPI - PullRequest
11 голосов
/ 14 марта 2012

У меня проблемы с запросами, которые содержат «опасные символы» как часть URL-адреса Web API.Url включает &, который правильно закодирован в Url, но все равно вызывает ошибку ASP.NET проверки правильности.

В отличие от MVC, похоже, отсутствует атрибут [ValidateInput (false)] для принудительного отключения и отключения этой функции.

Ответы [ 4 ]

8 голосов
/ 14 марта 2012

Оказывается, ответ заключается в том, чтобы сделать это в web.config, используя:

<system.web>
  <httpRuntime requestPathInvalidCharacters="" />  
</system.web>

Вы можете установить это глобально или на уровне подкаталога.Вы можете использовать элемент <location path="">, чтобы указать этот параметр только под определенными путями.Например, если затронутый маршрут вашего веб-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

2 голосов
/ 22 июля 2015

Вы можете получить более детальный контроль над этим, установив атрибут 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, что обходит проверку.

2 голосов
/ 10 апреля 2013

Если в конфигурации 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

1 голос
/ 10 апреля 2013

за @ Леви наш сотрудник по веб-безопасности:

Config - единственный способ сделать это. Даже MVC [ValidateInput (false)] не поможет с этим конкретным сценарием.

Отключение в Web.config не является ужасной идеей. Если вы соблюдаете правила безопасности при проверке и кодировании ненадежных данных, то можно применять их в масштабах всего приложения.

...