CA5391: использование маркеров защиты от подделки в контроллерах MVC ASP.NET Core
Свойство | Значение |
---|---|
Идентификатор правила | CA5391 |
Заголовок | используйте маркеры защиты от подделки в контроллерах MVC ASP.NET Core |
Категория | Безопасность |
Исправление является критическим или не критическим | Не критическое |
Включен по умолчанию в .NET 8 | No |
Причина
Действия, которые приводят к изменению операций, не содержат атрибут маркера для защиты от подделки. Или использование глобального фильтра маркера для защиты от подделки без вызова ожидаемых функций маркера для защиты от подделки.
Описание правила
Обработка запроса POST
, PUT
, PATCH
или DELETE
без проверки маркера для защиты от подделки может стать уязвимой для атак с использованием подделки межсайтовых запросов. Атака с использованием подделки межсайтовых запросов позволяет отправлять вредоносные запросы от пользователя, прошедшего проверку подлинности, в контроллер MVC ASP.NET Core.
Устранение нарушений
- Пометьте действие изменения допустимым атрибутом маркера антифоргерии:
- Microsoft.AspNetCore.Mvc.ValidateAntiForgeryTokenAttribute.
- Атрибут с именем, аналогичным
%Validate%Anti_orgery%Attribute
.
- Добавьте допустимый атрибут маркера для защиты от подделки в глобальный фильтр с помощью Microsoft.AspNetCore.Mvc.Filters.FilterCollection.Add.
- Добавьте любой настраиваемый или предоставленный MVC класс фильтра защиты от подделки, который вызывает
Validate
для любого класса, реализующего интерфейс Microsoft.AspNetCore.Antiforgery.IAntiforgery.
Когда лучше отключить предупреждения
Это правило можно безопасно отключить, если для устранения уязвимостей CSRF используются решения, не связанные с атрибутами маркера для защиты от подделки. Дополнительные сведения см. на странице Предотвращение атак с использованием подделки межсайтовых запросов (XSRF/CSRF) в ASP.NET Core.
Отключение предупреждений
Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.
#pragma warning disable CA5391
// The code that's violating the rule is on this line.
#pragma warning restore CA5391
Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none
в файле конфигурации.
[*.{cs,vb}]
dotnet_diagnostic.CA5391.severity = none
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.
Настройка кода для анализа
Вы можете настроить, будет ли правило применяться только к производным классам Microsoft.AspNetCore.Mvc.Controller в вашей базе кода. Например, чтобы указать, что правило не должно выполняться в каком-либо коде в производных типах ControllerBase, добавьте следующую пару "ключ-значение" в файл .editorconfig в своем проекте:
dotnet_code_quality.CA5391.exclude_aspnet_core_mvc_controllerbase = true
Примеры псевдокода
Без нарушения атрибута маркера для защиты от подделки
using Microsoft.AspNetCore.Mvc;
class ExampleController : Controller
{
[HttpDelete]
public IActionResult ExampleAction (string actionName)
{
return null;
}
[ValidateAntiForgeryToken]
[HttpDelete]
public IActionResult AnotherAction (string actionName)
{
return null;
}
}
Без допустимого глобального фильтра защиты от подделки
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
class ExampleController : Controller
{
[ValidateAntiForgeryToken]
[HttpDelete]
public IActionResult AnotherAction (string actionName)
{
return null;
}
[HttpDelete]
public IActionResult ExampleAction (string actionName)
{
return null;
}
}
class FilterClass : IAsyncAuthorizationFilter
{
public Task OnAuthorizationAsync (AuthorizationFilterContext context)
{
return null;
}
}
class BlahClass
{
public static void BlahMethod ()
{
FilterCollection filterCollection = new FilterCollection ();
filterCollection.Add(typeof(FilterClass));
}
}
Отмечено решением атрибута маркера для защиты от подделки
using Microsoft.AspNetCore.Mvc;
class ExampleController : Controller
{
[ValidateAntiForgeryToken]
[HttpDelete]
public IActionResult ExampleAction ()
{
return null;
}
[ValidateAntiForgeryToken]
[HttpDelete]
public IActionResult AnotherAction ()
{
return null;
}
}
Использование допустимого глобального фильтра защиты от подделки
using System.Threading.Tasks;
using Microsoft.AspNetCore.Antiforgery;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
class ExampleController : Controller
{
[ValidateAntiForgeryToken]
[HttpDelete]
public IActionResult AnotherAction()
{
return null;
}
[HttpDelete]
public IActionResult ExampleAction()
{
return null;
}
}
class FilterClass : IAsyncAuthorizationFilter
{
private readonly IAntiforgery antiforgery;
public FilterClass(IAntiforgery antiforgery)
{
this.antiforgery = antiforgery;
}
public Task OnAuthorizationAsync(AuthorizationFilterContext context)
{
return antiforgery.ValidateRequestAsync(context.HttpContext);
}
}
class BlahClass
{
public static void BlahMethod()
{
FilterCollection filterCollection = new FilterCollection();
filterCollection.Add(typeof(FilterClass));
}
}