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


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

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

Ловушка исключения и показ

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

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

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

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

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


1313


источник


Ответы:


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

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

Более того, " <«не является опасным по своей сути. Это опасно только в конкретном контексте: при записи строк, которые не были закодированы для вывода HTML (из-за XSS).

В других контекстах разные подстроки опасны, например, если вы пишете URL-адрес, предоставленный пользователем, в ссылку, подстрока " javascript:«может быть опасным. Одиночный кавычек, с другой стороны, опасен при интерполяции строк в SQL-запросах, но совершенно безопасен, если он является частью имени, представленного из формы или считанного из поля базы данных.

Суть в том, что вы не можете отфильтровать случайный ввод для опасных символов, потому что любой персонаж может быть опасен при правильных обстоятельствах. Вы должны кодировать в точке, где некоторые конкретные символы могут стать опасными, потому что они пересекаются на другом подязыке, где они имеют особое значение. Когда вы пишете строку в HTML, вы должны кодировать символы, имеющие особое значение в HTML, используя Server.HtmlEncode. Если вы передаете строку в динамический оператор SQL, вы должны кодировать разные символы (или, лучше, пусть фреймворк сделает это для вас с помощью подготовленных операторов или тому подобного).

когда вы уверены, что HTML-кодируете везде, где вы передаете строки в HTML, а затем установите validateRequest="false"в <%@ Page ... %>директивы в вашем .aspxфайл (ы).

В .NET 4 вам может понадобиться немного больше. Иногда необходимо также добавить <httpRuntime requestValidationMode="2.0" />на web.config ( Справка ).


991



Для этой ошибки существует другое решение, если вы используете ASP.NET MVC:

Пример C #:

[HttpPost, ValidateInput(false)]
public ActionResult Edit(FormCollection collection)
{
    // ...
}

Пример Visual Basic:

<AcceptVerbs(HttpVerbs.Post), ValidateInput(False)> _
Function Edit(ByVal collection As FormCollection) As ActionResult
    ...
End Function

465



В ASP.NET MVC (начиная с версии 3) вы можете добавить AllowHtmlатрибут свойства на вашей модели.

Он позволяет запросить включить HTML-разметку во время привязки к модели, пропустив проверку запроса для свойства.

[AllowHtml]
public string Description { get; set; }

356



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

202



For ASP.NET 4.0, you can allow markup as input for specific pages instead of the whole site by putting it all in a <location> element. This will make sure all your other pages are safe. You do NOT need to put ValidateRequest="false" in your .aspx page.

<configuration>
...
  <location path="MyFolder/.aspx">
    <system.web>
      <pages validateRequest="false" />
      <httpRuntime requestValidationMode="2.0" />
    </system.web>
  </location>
...
</configuration>

It is safer to control this inside your web.config, because you can see at a site level which pages allow markup as input.

You still need to programmatically validate input on pages where request validation is disabled.


102



The previous answers are great, but nobody said how to exclude a single field from being validated for HTML/JavaScript injections. I don't know about previous versions, but in MVC3 Beta you can do this:

[HttpPost, ValidateInput(true, Exclude = "YourFieldName")]
public virtual ActionResult Edit(int id, FormCollection collection)
{
    ...
}

This still validates all the fields except for the excluded one. The nice thing about this is that your validation attributes still validate the field, but you just don't get the "A potentially dangerous Request.Form value was detected from the client" exceptions.

I've used this for validating a regular expression. I've made my own ValidationAttribute to see if the regular expression is valid or not. As regular expressions can contain something that looks like a script I applied the above code - the regular expression is still being checked if it's valid or not, but not if it contains scripts or HTML.


67



In ASP.NET MVC you need to set requestValidationMode="2.0" and validateRequest="false" in web.config, and apply a ValidateInput attribute to your controller action:

<httpRuntime requestValidationMode="2.0"/>

<configuration>
    <system.web>
        <pages validateRequest="false" />
    </system.web>
</configuration>

and

[Post, ValidateInput(false)]
public ActionResult Edit(string message) {
    ...
}

46



You can HTML encode text box content, but unfortunately that won't stop the exception from happening. In my experience there is no way around, and you have to disable page validation. By doing that you're saying: "I'll be careful, I promise."


45



For MVC, ignore input validation by adding

[ValidateInput(false)]

above each Action in the Controller.


42