CA5391: Använda antiforgery-token i ASP.NET Core MVC-styrenheter
Property | Värde |
---|---|
Regel-ID | CA5391 |
Title | 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 9 | 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
, PATCH
eller 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
- Markera ändringsåtgärden med ett giltigt attribut för antiforgerytoken:
- Microsoft.AspNetCore.Mvc.ValidateAntiForgeryTokenAttribute.
- Attribut vars namn är som
%Validate%Anti_orgery%Attribute
.
- Lägg till det giltiga förfalskningstokenattributet i det globala filtret med Microsoft.AspNetCore.Mvc.Filters.FilterCollection.Add.
- Lägg till alla anpassade filterklasser eller Mvc-angivna antiforgeryfilterklasser som anropar
Validate
alla klasser som implementerar Microsoft.AspNetCore.Antiforgery.IAntiforgery gränssnittet.
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));
}
}