Как отключить проверку запроса, не устанавливая requestValidationMode на 2.0?

#c# #.net #asp.net #request-validation #requestvalidationmode

#c# #.net #asp.net #запрос-проверка #requestvalidationmode

Вопрос:

Мы только что обновились до ASP.NET 4.0, и обнаружил, что проверка запроса больше не работает. Документы MSDN предполагают, что нам нужно установить requestValidationMode в web.config на 2.0:

  • 4.0 (по умолчанию). Объект HttpRequest внутренне устанавливает флаг, который указывает, что проверка запроса должна запускаться при каждом обращении к любым данным HTTP-запроса. Это гарантирует, что проверка запроса запускается до того, как во время запроса будут доступны такие данные, как файлы cookie и URL-адреса. Параметры проверки запроса элемента pages (если таковые имеются) в файле конфигурации или директивы @ Page на отдельной странице игнорируются.
  • 2.0. Проверка запроса включена только для страниц, а не для всех HTTP-запросов. Кроме того, параметры проверки запроса элемента pages (если таковые имеются) в файле конфигурации или директивы @ Page на отдельной странице используются для определения того, какие запросы страницы следует проверять.

Это будет работать для нас, однако я немного озадачен. Похоже, мы переводим это в устаревший режим / режим совместимости. Конечно, должно быть возможно иметь поведение 4.0, но все же есть возможность отключить это на странице?

Комментарии:

1. Поскольку этот вопрос был задан, теперь есть опция «4.5», по умолчанию, описанная как «В этом режиме значения загружаются лениво, то есть они не считываются до тех пор, пока они не будут запрошены». Я протестировал это, и, похоже, оно учитывает как директиву @Page ValidateRequest, так и ValidateRequestMode на уровне управления.

2. @user0474975 вы должны опубликовать это в качестве ответа 🙂

Ответ №1:

Я нашел способ добиться этого, не меняя requestValidationMode на 2.0 для всего сайта:

Вы можете создать подкаталог для страницы, для которой хотите отключить проверку запроса, и добавить новый web.config в этот каталог с requestValidationMode, установленным на 2.0, таким образом, только этот каталог будет работать в режиме 2.0, не затрагивая все остальные запросы, которые будут работать в режиме 4.0.

Я думаю, вы можете добавить раздел location в свой основной web.config, указав только одну страницу, но я еще не тестировал это. Что-то вроде этого:

 <location path="Admin/Translation.aspx">
    <system.web>
        <httpRuntime requestValidationMode="2.0"/>
    </system.web>
</location>
  

Надеюсь, это поможет вам так же, как помогло мне!

Комментарии:

1. Работает отлично, спасибо. Некоторые вещи, которые я узнал: Местоположение добавляется в раздел <конфигурация> как дочерний элемент <system.web> . Значение атрибута path не может начинаться с префикса /. Можно добавить одну страницу или целую папку (не используйте завершающий /)

Ответ №2:

Лучше всего переопределить requestValidationType своим собственным кодом:

<httpRuntime requestValidationType="YourNamespace.YourValidator" />

Ссылка на MSDN

Комментарии:

1. Мне пришлось использовать этот метод для моего приложения MVC. У меня был сторонний контроллер, который должен был получать HTML в качестве параметра, а другие ответы здесь не работали. Спасибо ScottRFrost.

Ответ №3:

Похоже, что невозможно включить или отключить это для страницы в requestValidationMode 4.0.

В этом техническом документе описываются основные изменения в .Net 4.0, одним из которых, по-видимому, является это. Даже технический документ предлагает вернуться к requestValidationMode 2.0

Чтобы вернуться к поведению ASP.NET 2.0 функция проверки запроса, добавьте следующий параметр в файл Web.config:

<httpRuntime requestValidationMode="2.0" />

Хотя это также полезно рекомендует

что вы анализируете любые ошибки проверки запроса, чтобы определить, обращаются ли существующие обработчики, модули или другой пользовательский код к потенциально небезопасным входным данным HTTP, которые могут быть векторами атаки XSS.

без каких-либо указаний о том, как лучше всего решить эти проблемы

Ответ №4:

Установите requestValidationMode=»0.0″ для отключения ASP.NET проверка страниц и HTTP-запросов. Значение 0.0, распознанное в ASP.NET 4.6 и более поздние версии. MSDN

 <configuration>
  <system.web>
    <httpRuntime requestValidationMode="0.0" />
  

Ответ №5:

Вы можете установить ValidateRequest значение false в директиве страницы:

 <%@ Page ValidateRequest="false" %>
  

Комментарии:

1. @James Johnson Спасибо за правильное форматирование моего ответа (чтобы он выглядел как код вместо текста)

2. @Stilgar: Понял, в чем заключалась реальная проблема, после того, как вы спросили меня, спасибо:(

3. Как уже упоминалось, это не работает: (В версии 4 «Параметры проверки запроса элемента pages (если таковые имеются) в файле конфигурации или директивы @ Page на отдельной странице игнорируются»