Обнаружено потенциально опасное значение Request.Form, полученное от клиента
Каждый раз, когда пользователь отправляет данные, содержащие символы <
или >
на странице моего веб-приложения, возникает исключение.
Я не хочу углубляться в обсуждение разумности выброса исключения или аварийного завершения всего веб-приложения, из-за того что кто-то ввел символ в текстовое поле, но ищу элегантное решение данной проблемы.
Перехват исключения и отображение сообщения:
Произошла ошибка, пожалуйста, вернитесь и заполните всю форму заново, но на этот раз, пожалуйста, не используйте <
не кажется мне достаточно профессиональным.
Отключение проверки поста (validateRequest="false"
) определенно поможет избежать этой ошибки, но оставит страницу уязвимой для ряда атак.
Идеально было бы, если при отправке формы, содержащей символы HTML, значение в коллекции Form автоматически кодировалось бы в HTML. Таким образом, свойство .Text
моего текстового поля будет содержать something & lt; html & gt;
.
Есть ли способ сделать это через обработчик?
5 ответ(ов)
Если вы используете .NET 4.0, убедитесь, что вы добавили следующее в ваш файл web.config внутри тегов <system.web>
:
<httpRuntime requestValidationMode="2.0" />
В .NET 2.0 валидация запросов применялась только к aspx
запросам. В .NET 4.0 это было расширено и теперь включает все запросы. Вы можете вернуть ситуацию к прежнему состоянию, выполняя валидацию XSS только при обработке .aspx
файлов, указав:
requestValidationMode="2.0"
Если же вы хотите полностью отключить валидацию запросов, используйте:
validateRequest="false"
Для ASP.NET 4.0 вы можете разрешить использование разметки в качестве входных данных только для определенных страниц, а не для всего сайта, поместив настройки в элемент <location>
. Это гарантирует, что все остальные страницы будут защищены. Вам не нужно указывать ValidateRequest="false"
в вашей .aspx-странице.
Вот пример конфигурации:
<configuration>
...
<location path="MyFolder/.aspx">
<system.web>
<pages validateRequest="false" />
<httpRuntime requestValidationMode="2.0" />
</system.web>
</location>
...
</configuration>
Контролировать это в файле web.config более безопасно, так как вы можете видеть на уровне сайта, какие страницы разрешают ввод разметки.
Имейте в виду, что вам все равно необходимо программно проверять входные данные на страницах, где валидация запросов отключена.
Предыдущие ответы отличные, но никто не упомянул, как исключить отдельное поле из валидации на наличие HTML/JavaScript-инъекций. Не знаю, как было в предыдущих версиях, но в MVC3 Beta это можно сделать следующим образом:
[HttpPost, ValidateInput(true, Exclude = "YourFieldName")]
public virtual ActionResult Edit(int id, FormCollection collection)
{
...
}
Этот код валидирует все поля, кроме исключенного. Приятно то, что ваши атрибуты валидации по-прежнему проверяют это поле, но исключаются исключения типа "A potentially dangerous Request.Form value was detected from the client".
Я использовал это для валидации регулярного выражения. Я создал свой собственный ValidationAttribute, чтобы проверить, является ли регулярное выражение допустимым. Поскольку регулярные выражения могут содержать что-то, что выглядит как скрипт, я применил указанный выше код – регулярное выражение все еще проверяется на допустимость, но не на наличие скриптов или HTML.
Чтобы в ASP.NET MVC отключить проверку запросов, вам нужно установить requestValidationMode="2.0"
и validateRequest="false"
в файле web.config
, а также применить атрибут [ValidateInput(false)]
к вашему контроллеру. Вот как это сделать:
- В файле
web.config
добавьте следующие настройки:
<httpRuntime requestValidationMode="2.0"/>
<configuration>
<system.web>
<pages validateRequest="false" />
</system.web>
</configuration>
- Затем в вашем контроллере добавьте атрибут
ValidateInput
к нужному действию:
[HttpPost, ValidateInput(false)]
public ActionResult Edit(string message) {
// ваша логика обработки
...
}
Не забудьте, что отключение проверки запросов может привести к уязвимостям, таким как XSS, поэтому всегда будьте осторожны с тем, какие данные вы принимаете и обрабатываете.
Ответ на этот вопрос прост:
var varname = Request.Unvalidated["parameter_name"];
Это отключит валидацию для этого конкретного запроса.
Проверка десятичных чисел в JavaScript - IsNumeric()
Как проверить, является ли строка действительным числом?
JavaScriptSerializer - Сериализация JSON перечислений в виде строк
Как установить заголовок Content-Type для запроса HttpClient?
ASP.NET Веб-сайт или ASP.NET Веб-приложение?