Sdílet prostřednictvím


CA5391: Používejte antiforgery tokeny v řadičích ASP.NET Core MVC

Vlastnost Hodnota
ID pravidla CA5391
Název Používat tokeny proti padělkům v kontrolerech MVC ASP.NET Core
Kategorie Zabezpečení
Oprava, která může být destruktivní nebo nedestruktivní Nezlomitelný
Povoleno ve výchozím nastavení v .NET 10 Ne
Příslušné jazyky C# a Visual Basic

Příčina

Akce, které vedou k úpravě operací, nemají atribut tokenu antiforgery. Nebo použití globálního filtru proti padělání bez volání očekávaných funkcí tokenů proti padělání.

Popis pravidla

Zpracování požadavku na POST, PUT, PATCH nebo DELETE bez ověření antiforgery tokenu může být zranitelné vůči útokům typu cross-site request forgery (CSRF). Útok typu cross-site request forgery (CSRF) může posílat škodlivé požadavky ověřeného uživatele do kontroleru ASP.NET Core MVC.

Jak opravit porušení

Kdy potlačit upozornění

Toto pravidlo je bezpečné potlačit, pokud se ke zmírnění ohrožení zabezpečení CSRF přijímají jiná řešení než použití atributů tokenu antiforgery. Další informace najdete v tématu Prevence útoků založených na padělání žádosti posílané mezi weby (XSRF/CSRF) v ASP.NET Core.

Potlačení upozornění

Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.

#pragma warning disable CA5391
// The code that's violating the rule is on this line.
#pragma warning restore CA5391

Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none konfiguračním souboru.

[*.{cs,vb}]
dotnet_diagnostic.CA5391.severity = none

Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.

Konfigurace kódu pro analýzu

Můžete nakonfigurovat, zda pravidlo platí pouze pro odvozené třídy v základu Microsoft.AspNetCore.Mvc.Controller kódu. Pokud chcete například určit, že pravidlo by se nemělo spouštět u žádného kódu v odvozených typech ControllerBase, přidejte do souboru .editorconfig v projektu následující dvojici klíč-hodnota:

dotnet_code_quality.CA5391.exclude_aspnet_core_mvc_controllerbase = true

Příklady pseudokódu

Bez porušení atributu tokenu proti padělání

using Microsoft.AspNetCore.Mvc;

class ExampleController : Controller
{
    [HttpDelete]
    public IActionResult ExampleAction(string actionName)
    {
        return null;
    }

    [ValidateAntiForgeryToken]
    [HttpDelete]
    public IActionResult AnotherAction(string actionName)
    {
        return null;
    }
}

Bez platného globálního filtru proti padělání

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));
    }
}

Označeno řešením atributu proti padělání tokenu

using Microsoft.AspNetCore.Mvc;

class ExampleController : Controller
{
    [ValidateAntiForgeryToken]
    [HttpDelete]
    public IActionResult ExampleAction()
    {
        return null;
    }

    [ValidateAntiForgeryToken]
    [HttpDelete]
    public IActionResult AnotherAction()
    {
        return null;
    }
}

Použití platného globálního filtru proti padělání

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));
    }
}