Открытая коллекция знаний

OpenU.Ru

Безопасность проектов .NET Framework и .NET Core

Отключение валидации HTTP-запросов ASP.NET

Отключение валидации запросов в ASP.NET MVC

Чтобы отключить проверки запросов в приложении ASP.NET MVC, можно изменить проверку запроса на более ранний вариант обработки запроса, как и для веб-форм ASP.NET. В файле Web.config, сделайте следующие настройки:

<System.web>
  <HttpRuntime requestValidationMode = "2.0" />
</system.web>

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

В ASP.NET MVC можно отключить проверки запросов отдельно для метода действия, для свойства, или для поля (элемента ввода) в запросе. Если отключить проверку для метода действия, она будет отключена для любых запросов, которые вызывают этот метод. То есть разрешены все входные данные для любого запроса, который вызывает метод действия. Таким образом, этот подход является наименее безопасным способом отключения валидации запроса.

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

Чтобы отключить проверку запроса для всего метода действия, нужно у метода установить атрибут ValidateInput (false), как показано в следующем примере:

[HttpPost]
[ValidateInput(false)]
public ActionResult Edit(string comment) 
{
    if (ModelState.IsValid) 
    {
        //  Etc.
    }
    return View(comment);
}

Чтобы отключить валидацию запросов для конкретного свойства, нужно отметить определение свойства атрибутом AllowHtml:

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

Примечание: Атрибут [AllowHtml] иногда может выдавать ошибку: CS0246 Не удалось найти тип или имя пространства имен AllowHtml. Дело в том, что атрибут [AllowHtml] работает в пространстве MVC и располагается в сборке System.Web.Mvc класс AllowHtmlAttribute. Так что если объекты модели вынесены в отдельный проект (библиотеку классов), отличный от проекта MVC, но используются как модель для MVC, такой атрибут просто так не сработает. Нужно к этому проекту подключить пакет NuGet Microsoft.AspNet.Mvc.

Чтобы отключить проверку запроса для конкретного поля в запросе (например, для элемента input или значения строки запроса), следует вызвать метод Request.Unvalidated, когда вы получаете деталь, как показано в следующем примере:

var rawComment = Request.Unvalidated().Form["comment"];