Как я могу переопределить RequestValidation в веб-API ASP.NET

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

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

4 ответов


оказывается, ответ для этого в интернете.настройка с помощью:

<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=против 100).aspx


С 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


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


per @Levi наш веб-охранник:

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

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