16

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

11

Каждый раз, когда пользователь отправляет данные, содержащие символы < или > на странице моего веб-приложения, возникает исключение.

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

Перехват исключения и отображение сообщения:

Произошла ошибка, пожалуйста, вернитесь и заполните всю форму заново, но на этот раз, пожалуйста, не используйте <

не кажется мне достаточно профессиональным.

Отключение проверки поста (validateRequest="false") определенно поможет избежать этой ошибки, но оставит страницу уязвимой для ряда атак.

Идеально было бы, если при отправке формы, содержащей символы HTML, значение в коллекции Form автоматически кодировалось бы в HTML. Таким образом, свойство .Text моего текстового поля будет содержать something & lt; html & gt;.

Есть ли способ сделать это через обработчик?

5 ответ(ов)

2

Если вы используете .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"
1

Для 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 более безопасно, так как вы можете видеть на уровне сайта, какие страницы разрешают ввод разметки.

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

0

Предыдущие ответы отличные, но никто не упомянул, как исключить отдельное поле из валидации на наличие 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.

0

Чтобы в ASP.NET MVC отключить проверку запросов, вам нужно установить requestValidationMode="2.0" и validateRequest="false" в файле web.config, а также применить атрибут [ValidateInput(false)] к вашему контроллеру. Вот как это сделать:

  1. В файле web.config добавьте следующие настройки:
<httpRuntime requestValidationMode="2.0"/>

<configuration>
    <system.web>
        <pages validateRequest="false" />
    </system.web>
</configuration>
  1. Затем в вашем контроллере добавьте атрибут ValidateInput к нужному действию:
[HttpPost, ValidateInput(false)]
public ActionResult Edit(string message) {
    // ваша логика обработки
    ...
}

Не забудьте, что отключение проверки запросов может привести к уязвимостям, таким как XSS, поэтому всегда будьте осторожны с тем, какие данные вы принимаете и обрабатываете.

0

Ответ на этот вопрос прост:

var varname = Request.Unvalidated["parameter_name"];

Это отключит валидацию для этого конкретного запроса.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь