Share via


CA5391: Använda antiforgery-token i ASP.NET Core MVC-styrenheter

Property Värde
Regel-ID CA5391
Rubrik Använda antiforgery-token i ASP.NET Core MVC-styrenheter
Kategori Säkerhet
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 8 Nej

Orsak

Åtgärder som resulterar i att åtgärder ändras har inget attribut för antiforgerytoken. Eller använda ett globalt antiforgerytokenfilter utan att anropa förväntade funktioner för förfalskningstoken.

Regelbeskrivning

Hantering av en POST, PUT, PATCHeller DELETE begäran utan att verifiera en antiforgery-token kan vara sårbart för förfalskningsattacker mellan webbplatser. En förfalskningsattack mellan webbplatser kan skicka skadliga begäranden från en autentiserad användare till din ASP.NET Core MVC-styrenhet.

Så här åtgärdar du överträdelser

När du ska ignorera varningar

Det är säkert att utelämna den här regeln om andra lösningar än att använda attribut för antiforgerytoken används för att minska CSRF-sårbarheter. Mer information finns i Förhindra XSRF-/CSRF-attacker (Cross-Site Request Forgery) i ASP.NET Core.

Ignorera en varning

Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.

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

Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none i konfigurationsfilen.

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

Mer information finns i Så här utelämnar du kodanalysvarningar.

Konfigurera kod för analys

Du kan konfigurera om regeln endast gäller för härledda klasser i Microsoft.AspNetCore.Mvc.Controller din kodbas. Om du till exempel vill ange att regeln inte ska köras på någon kod inom härledda typer av ControllerBaselägger du till följande nyckel/värde-par i en .editorconfig-fil i projektet:

dotnet_code_quality.CA5391.exclude_aspnet_core_mvc_controllerbase = true

Exempel på pseudokod

Utan brott mot attribut för förfalskningstoken

using Microsoft.AspNetCore.Mvc;

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

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

Utan giltigt globalt förfalskningsfilter

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

Markerad med en lösning för antiförfalskningstokenattribut

using Microsoft.AspNetCore.Mvc;

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

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

Använda ett giltigt globalt förfalskningsfilter

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