CA5391: Używanie tokenów antyforgeryjnych w kontrolerach ASP.NET Core MVC

Właściwości Wartość
Identyfikator reguły CA5391
Stanowisko 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 8 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, PATCHlub 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

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));
    }
}