Share via


CA5391: Antiforgery-tokens gebruiken in ASP.NET Core MVC-controllers

Eigenschappen Weergegeven als
Regel-id CA5391
Titel Antiforgery-tokens gebruiken in ASP.NET Core MVC-controllers
Categorie Beveiliging
Oplossing is brekend of niet-brekend Niet-brekend
Standaard ingeschakeld in .NET 9 Nee

Oorzaak

Acties die resulteren in het wijzigen van bewerkingen hebben geen antiforgery-tokenkenmerk. Of gebruik een globaal antiforgery-tokenfilter zonder verwachte antivervalsingstokenfuncties aan te roepen.

Beschrijving van regel

Het verwerken van eenPOST, PUTPATCHof aanvraag DELETE zonder een antiforgery-token te valideren, kan kwetsbaar zijn voor vervalsingsaanvallen op meerdere sites. Een aanval op aanvraagvervalsing op meerdere sites kan schadelijke aanvragen van een geverifieerde gebruiker verzenden naar uw ASP.NET Core MVC-controller.

Schendingen oplossen

Wanneer waarschuwingen onderdrukken

Het is veilig om deze regel te onderdrukken als andere oplossingen dan het gebruik van antiforgery-tokenkenmerken worden gebruikt om CSRF-beveiligingsproblemen te beperken. Zie Cross-Site Request Forgery-aanvallen (XSRF/CSRF) voorkomen in ASP.NET Core voor meer informatie.

Een waarschuwing onderdrukken

Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.

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

Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst none ervan in op het configuratiebestand.

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

Zie Codeanalysewaarschuwingen onderdrukken voor meer informatie.

Code configureren om te analyseren

U kunt configureren of de regel alleen van toepassing is op afgeleide klassen in Microsoft.AspNetCore.Mvc.Controller uw codebasis. Als u bijvoorbeeld wilt opgeven dat de regel niet mag worden uitgevoerd op code binnen afgeleide typen ControllerBase, voegt u het volgende sleutel-waardepaar toe aan een .editorconfig-bestand in uw project:

dotnet_code_quality.CA5391.exclude_aspnet_core_mvc_controllerbase = true

Voorbeelden van pseudocode

Zonder schending van het tokenkenmerk antivervalsing

using Microsoft.AspNetCore.Mvc;

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

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

Zonder geldig globaal antivervalsingsfilter

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

Gemarkeerd met een antivervalsingstokenkenoplossing

using Microsoft.AspNetCore.Mvc;

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

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

Een geldig globaal antivervalsingsfilter gebruiken

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