CA5391: Używanie tokenów antyforgeryjnych w kontrolerach ASP.NET Core MVC
Właściwości | Wartość |
---|---|
Identyfikator reguły | CA5391 |
Tytuł | Użyj tokenów zabezpieczających przed fałszerstwem w kontrolerach MVC platformy ASP.NET Core |
Kategoria | Bezpieczeństwo |
Poprawka powodująca niezgodność lub niezgodność | Niezgodność |
Domyślnie włączone na platformie .NET 9 | Nie. |
Przyczyna
Akcje, które powodują modyfikowanie operacji, nie mają atrybutu tokenu antyforgery. Możesz też użyć globalnego filtru tokenu chroniącego przed fałszerzacją bez wywoływania oczekiwanych funkcji tokenu ochrony przed fałszerzacją.
Opis reguły
Obsługa POST
żądania , PUT
, PATCH
lub DELETE
bez weryfikowania tokenu chroniącego przed fałszowaniem może być podatna na ataki fałszerskie żądania obejmujące wiele witryn. Atak z żądaniem fałszerzowania między witrynami może wysyłać złośliwe żądania od uwierzytelnionego użytkownika do kontrolera MVC platformy ASP.NET Core.
Jak naprawić naruszenia
- Oznacz akcję modyfikując za pomocą prawidłowego atrybutu tokenu antyforgery:
- Microsoft.AspNetCore.Mvc.ValidateAntiForgeryTokenAttribute.
- Atrybut, którego nazwa jest podobna do
%Validate%Anti_orgery%Attribute
.
- Dodaj prawidłowy atrybut tokenu fałszera do filtru globalnego za pomocą polecenia Microsoft.AspNetCore.Mvc.Filters.FilterCollection.Add.
- Dodaj dowolną niestandardową lub dostarczoną przez mvc klasę filtru chroniącą przed fałszerzami, która wywołuje
Validate
dowolną klasę Microsoft.AspNetCore.Antiforgery.IAntiforgery implementjącą interfejs.
Kiedy pomijać ostrzeżenia
Można bezpiecznie pominąć tę regułę, jeśli rozwiązania inne niż używanie atrybutów tokenów antyforgeryjnych są przyjęte w celu ograniczenia luk w zabezpieczeniach CSRF. Aby uzyskać więcej informacji, zobacz Zapobieganie atakom z fałszowaniem żądań międzywitrynowych (XSRF/CSRF) na platformie ASP.NET Core.
Pomijanie ostrzeżenia
Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.
#pragma warning disable CA5391
// The code that's violating the rule is on this line.
#pragma warning restore CA5391
Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none
w pliku konfiguracji.
[*.{cs,vb}]
dotnet_diagnostic.CA5391.severity = none
Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.
Konfigurowanie kodu do analizowania
Możesz skonfigurować, czy reguła ma zastosowanie tylko do klas pochodnych klasy Microsoft.AspNetCore.Mvc.Controller w bazie kodu. Aby na przykład określić, że reguła nie powinna być uruchamiana na żadnym kodzie w typach pochodnych ControllerBaseklasy , dodaj następującą parę klucz-wartość do pliku editorconfig w projekcie:
dotnet_code_quality.CA5391.exclude_aspnet_core_mvc_controllerbase = true
Przykłady przykładów kodu przykładowego
Bez naruszenia atrybutu tokenu fałszera
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 prawidłowego globalnego filtru ochrony przed fałszerzacją
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));
}
}
Oznaczone za pomocą rozwiązania atrybutu tokenu fałszera
using Microsoft.AspNetCore.Mvc;
class ExampleController : Controller
{
[ValidateAntiForgeryToken]
[HttpDelete]
public IActionResult ExampleAction ()
{
return null;
}
[ValidateAntiForgeryToken]
[HttpDelete]
public IActionResult AnotherAction ()
{
return null;
}
}
Używanie prawidłowego globalnego filtru ochrony przed fałszerzami
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));
}
}