Исключение "Потенциально опасный запрос. Форма" в универсальном обработчике

Я видел эту ошибку раньше, но не могу ее обойти. В этом случае у меня есть страница ASHX, в которой есть простая форма HTML с текстовым полем, в которое может быть размещен XML. Когда я пытаюсь прочитать форму, я получаю "потенциально опасное значение Request.Form...".

Поскольку это универсальный обработчик, атрибут "ValidateRequest" недоступен. Однако я уже определил это в web.config:

<location path="xml/MyGenericHandler.ashx">
    <system.web>
      <pages validateRequest="false" />
    </system.web>
</location>

Этот фрагмент предшествует переходу с.NET 3.5 на 4.0, поэтому я предполагаю, что именно здесь возникла поломка.

Любая идея, как обойти эту ошибку для страниц ASHX?

3 ответа

Решение

Изменения в версии 3.5-4.0, которые вас обошли, стали некоторыми усиленными функциями безопасности во время выполнения для ASP.NET 4.0. Быстрое решение заключается в применении следующего атрибута:

<httpRuntime requestValidationMode="2.0" />

К сожалению, это открывает все страницы до 2,0 запросов проверки, так что я бы сделал это, только если у вас есть относительно небольшая поверхность атаки.

Хотя это и не прямой ответ на ваш вопрос, я бы сказал, чтобы прочитать этот предыдущий пост. это дает вам способ убедиться, что ошибка не выдается. В каком-то смысле это рискованно, потому что это означает отключение базовой защиты. Тем не менее, ответ обоснован, и в нем четко говорится, что вы должны реализовывать его только тогда, когда вы абсолютно уверены, что кодируете все выходные данные.

От клиента было обнаружено потенциально опасное значение Request.Form

В качестве примечания я бы также рекомендовал использовать библиотеку Microsoft Anti-Xss, а не встроенные функции Server.HtmlEncode.

Однако, если вы можете изменить ashx, более простым решением было бы просто изменить код ошибки и добавить оператор "if", чтобы не регистрировать ошибки, если сообщение об ошибке содержит строку, которую вы хотите отфильтровать.

Вам лучше отключить проверку только для вашей страницы обработчика:

  <location path="MyGenericHandler.ashx">
    <system.web>
      <!-- requestValidationMode is to avoid HTML-validation of data posted to the handler -->
      <httpRuntime requestValidationMode="2.0"/>
    </system.web>
  </location>

Или используйте это свойство из вашего обработчика, чтобы избежать срабатывания исключения:

context.Request.Unvalidated.Form
Другие вопросы по тегам