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

Eigenschap Waarde
Regel-id CA5391
Titel Antiforgery-tokens gebruiken in ASP.NET Core MVC-controllers
Categorie Beveiliging
Fix kan brekend of niet-brekend zijn Niet-brekend
Standaard ingeschakeld in .NET 10 Nee
Toepasselijke talen C# en Visual Basic

Oorzaak

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

Beschrijving van regel

Het verwerken van een POST, PUT, PATCH, of DELETE aanvraag zonder een antiforgery-token te valideren, kan kwetsbaar zijn voor cross-site request forgery-aanvallen. Een aanval op aanvraagvervalsing op meerdere sites kan schadelijke aanvragen van een geverifieerde gebruiker verzenden naar uw ASP.NET Core MVC-controller.

Hoe schendingen op te lossen

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 voor meer informatie Hoe codeanalysewaarschuwingen te onderdrukken.

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