CA5391: Usare token antiforgery nei controller MVC di ASP.NET Core
Proprietà | valore |
---|---|
ID regola | CA5391 |
Titolo | Usare token antifalsificazione nei controller MVC ASP.NET Core |
Categoria | Sicurezza |
Correzione che causa un'interruzione o un'interruzione | Nessuna interruzione |
Abilitato per impostazione predefinita in .NET 8 | No |
Causa
Le azioni che comportano la modifica delle operazioni non hanno un attributo token antiforgery. In alternativa, usando un filtro token antiforgery globale senza chiamare le funzioni di token antifalsificazione previste.
Descrizione regola
La gestione di una POST
richiesta , PUT
, PATCH
o DELETE
senza convalidare un token antiforgery può essere vulnerabile agli attacchi falsi di richiesta intersito. Un attacco di richiesta intersito può inviare richieste dannose da un utente autenticato al controller ASP.NET Core MVC.
Come correggere le violazioni
- Contrassegnare l'azione di modifica con un attributo token antiforgery valido:
- Microsoft.AspNetCore.Mvc.ValidateAntiForgeryTokenAttribute.
- Attributo il cui nome è simile a
%Validate%Anti_orgery%Attribute
.
- Aggiungere l'attributo del token forgery valido nel filtro globale con Microsoft.AspNetCore.Mvc.Filters.FilterCollection.Add.
- Aggiungere qualsiasi classe di filtro antiforgery personalizzata o fornita da Mvc che chiama
Validate
su qualsiasi classe che implementa l'interfaccia Microsoft.AspNetCore.Antiforgery.IAntiforgery .
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 altre informazioni, vedere Prevenire attacchi tramite richieste intersito false (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-falsità
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 antigery 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 antigery 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));
}
}