Condividi tramite


CA5391: Usare token antiforgery nei controller MVC di ASP.NET Core

Proprietà valore
ID regola CA5391
Title Usare i token antifalsificazione nei controller di ASP.NET Core MVC
Categoria Sicurezza
La correzione causa un'interruzione o meno Non rompente
Abilitato per impostazione predefinita in .NET 10 No
Linguaggi applicabili C# e Visual Basic

Causa

Le azioni che comportano la modifica delle operazioni non dispongono di un attributo token antiforgery. In alternativa, utilizzando un filtro globale per il token antifalsificazione senza chiamare le funzioni previste del token antifalsificazione.

Descrizione regola

La gestione di una richiesta POST, PUT, PATCH o DELETE senza convalidare un token antiforgery può essere vulnerabile agli attacchi di cross-site request forgery. Un attacco di falsificazione di richiesta intersito può inviare richieste dannose da un utente autenticato al controller ASP.NET Core MVC.

Come correggere le violazioni

Quando eliminare gli avvisi

È sicuro eliminare questa regola se vengono adottate soluzioni diverse dall'uso degli attributi del token antiforgery per attenuare le vulnerabilità CSRF. Per ulteriori informazioni, vedere Prevenire gli attacchi da falsificazione di richieste tra siti (XSRF/CSRF) in ASP.NET Core.

Eliminare un avviso

Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.

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

Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità none su nel file di configurazione.

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

Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.

Configurare il codice da analizzare

È possibile configurare se la regola si applica solo alle classi derivate di Microsoft.AspNetCore.Mvc.Controller nella codebase. Ad esempio, per specificare che la regola non deve essere eseguita in alcun codice all'interno di tipi derivati di ControllerBase, aggiungere la coppia chiave-valore seguente a un file con estensione editorconfig nel progetto:

dotnet_code_quality.CA5391.exclude_aspnet_core_mvc_controllerbase = true

Esempi di pseudo-codice

Senza violazione dell'attributo del token anti-falsificazione

using Microsoft.AspNetCore.Mvc;

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

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

Senza un filtro anti contraffazione globale valido

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

Contrassegnato con una soluzione di attributo token anti-falsità

using Microsoft.AspNetCore.Mvc;

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

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

Uso di un filtro anti-contraffazione globale valido

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