Исключение "Потенциально опасный запрос. Форма" в универсальном обработчике
Я видел эту ошибку раньше, но не могу ее обойти. В этом случае у меня есть страница 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