CA5391: Použití antiforgery tokenů v řadičích ASP.NET Core MVC
Vlastnost | Hodnota |
---|---|
ID pravidla | CA5391 |
Název | Používat tokeny proti padělkům v kontrolerech MVC ASP.NET Core |
Kategorie | Zabezpečení |
Oprava způsobující chybu nebo chybu způsobující chybu | Nenarušující |
Povoleno ve výchozím nastavení v .NET 8 | No |
Příčina
Akce, které vedou k úpravě operací, nemají atribut tokenu antiforgery. Nebo použití globálního filtru tokenů antiforgery bez volání očekávaných funkcí proti padělání tokenů.
Popis pravidla
Zpracování objektu POST
, , PUT
PATCH
nebo DELETE
požadavku bez ověření antiforgery tokenu může být zranitelné vůči útokům typu forgery mezi weby. Útok na padělání požadavků mezi weby může posílat škodlivé požadavky ověřeného uživatele do kontroleru ASP.NET Core MVC.
Jak opravit porušení
- Označte akci úpravy platným atributem tokenu antiforgery:
- Microsoft.AspNetCore.Mvc.ValidateAntiForgeryTokenAttribute.
- Atribut, jehož název je podobný
%Validate%Anti_orgery%Attribute
.
- Přidejte platný atribut tokenu forgery do globálního filtru pomocí Microsoft.AspNetCore.Mvc.Filters.FilterCollection.Add.
- Přidejte jakoukoli vlastní třídu filtru antiforgery nebo Mvc, která volá
Validate
jakoukoli třídu, která implementuje Microsoft.AspNetCore.Antiforgery.IAntiforgery rozhraní.
Kdy potlačit upozornění
Toto pravidlo je bezpečné potlačit, pokud se ke zmírnění ohrožení zabezpečení CSRF přijímají jiná řešení než použití atributů tokenu antiforgery. Další informace najdete v tématu Prevence útoků založených na padělání žádosti posílané mezi weby (XSRF/CSRF) v ASP.NET Core.
Potlačení upozornění
Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.
#pragma warning disable CA5391
// The code that's violating the rule is on this line.
#pragma warning restore CA5391
Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none
konfiguračním souboru.
[*.{cs,vb}]
dotnet_diagnostic.CA5391.severity = none
Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.
Konfigurace kódu pro analýzu
Můžete nakonfigurovat, zda pravidlo platí pouze pro odvozené třídy v základu Microsoft.AspNetCore.Mvc.Controller kódu. Pokud chcete například určit, že pravidlo by se nemělo spouštět u žádného kódu v odvozených typech ControllerBase, přidejte do souboru .editorconfig v projektu následující dvojici klíč-hodnota:
dotnet_code_quality.CA5391.exclude_aspnet_core_mvc_controllerbase = true
Příklady pseudokódu
Bez porušení atributu proti padělání tokenu
using Microsoft.AspNetCore.Mvc;
class ExampleController : Controller
{
[HttpDelete]
public IActionResult ExampleAction (string actionName)
{
return null;
}
[ValidateAntiForgeryToken]
[HttpDelete]
public IActionResult AnotherAction (string actionName)
{
return null;
}
}
Bez platného globálního filtru proti padělání
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));
}
}
Označeno řešením atributu proti padělání tokenu
using Microsoft.AspNetCore.Mvc;
class ExampleController : Controller
{
[ValidateAntiForgeryToken]
[HttpDelete]
public IActionResult ExampleAction ()
{
return null;
}
[ValidateAntiForgeryToken]
[HttpDelete]
public IActionResult AnotherAction ()
{
return null;
}
}
Použití platného globálního filtru proti padělání
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));
}
}