Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
| 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 10 | 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, , PUTPATCHnebo 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á
Validatejakoukoli 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));
}
}