Поделиться через


CA5391: использование маркеров защиты от подделки в контроллерах MVC ASP.NET Core

Свойство Значение
Идентификатор правила CA5391
Заголовок используйте маркеры защиты от подделки в контроллерах MVC ASP.NET Core
Категория Безопасность
Исправление является критическим или не критическим Не критическое
Включен по умолчанию в .NET 8 No

Причина

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

Описание правила

Обработка запроса POST, PUT, PATCH или DELETE без проверки маркера для защиты от подделки может стать уязвимой для атак с использованием подделки межсайтовых запросов. Атака с использованием подделки межсайтовых запросов позволяет отправлять вредоносные запросы от пользователя, прошедшего проверку подлинности, в контроллер MVC ASP.NET Core.

Устранение нарушений

  • Пометьте действие изменения допустимым атрибутом маркера антифоргерии:
  • Добавьте допустимый атрибут маркера для защиты от подделки в глобальный фильтр с помощью 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));
    }
}