CA5391: Použití antiforgery tokenů 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 způsobující chybu nebo chybu způsobující chybu Nenarušující
Povoleno ve výchozím nastavení v .NET 8 No

Příčina

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

Popis pravidla

Zpracování objektu POST, , PUTPATCHnebo DELETE požadavku bez ověření antiforgery tokenu může být zranitelné vůči útokům typu forgery mezi weby. Útok na padělání požadavků mezi weby 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 proti padělání tokenu

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