Freigeben über


CA5391: Fälschungssicherheitstoken in ASP.NET Core MVC-Controllern verwenden.

Eigenschaft Wert
Regel-ID CA5391
Titel Fälschungssicherheitstoken in ASP.NET Core MVC-Controllern verwenden.
Kategorie Security
Fix führt oder führt nicht zur Unterbrechung Nicht unterbrechend
Standardmäßig in .NET 8 aktiviert Nein

Ursache

Aktionen, die zum Ändern von Vorgängen führen, haben kein Antifälschungstokenattribut. Oder Verwenden eines globalen Antifälschungstokenfilters, ohne erwartete Antifälschungstokenfunktionen aufzurufen.

Regelbeschreibung

Das Verarbeiten einer POST-, PUT-, PATCH- oder DELETE-Anforderung, ohne ein Antifälschungstoken zu validieren, kann für websiteübergreifende Anforderungsfälschungsangriffe anfällig machen. Mit einem websiteübergreifenden Anforderungsfälschungsangriff können böswillige Anforderungen von einem authentifizierten Benutzer an Ihren ASP.NET Core MVC-Controller gesendet werden.

Behandeln von Verstößen

Wann sollten Warnungen unterdrückt werden?

Es ist sicher, diese Regel zu unterdrücken, wenn andere Lösungen als Antifälschungstokenattribute verwendet werden, um CSRF-Sicherheitsrisiken zu entschärfen. Weitere Informationen finden Sie unter Prevent Cross-Site Request Forgery (XSRF/CSRF) Attacks in ASP.NET Core (Verhindern von websiteübergreifenden Anforderungsfälschungen (XSRF/CSRF) in ASP.NET Core).

Unterdrücken einer Warnung

Um nur eine einzelne Verletzung zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Regel zu deaktivieren und dann wieder zu aktivieren.

#pragma warning disable CA5391
// The code that's violating the rule is on this line.
#pragma warning restore CA5391

Um die Regel für eine Datei, einen Ordner oder ein Projekt zu deaktivieren, legen Sie den Schweregrad in der Konfigurationsdatei auf none fest.

[*.{cs,vb}]
dotnet_diagnostic.CA5391.severity = none

Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.

Konfigurieren des zu analysierenden Codes

Sie können konfigurieren, ob die Regel nur für abgeleitete Klassen von Microsoft.AspNetCore.Mvc.Controller in Ihrer Codebasis gilt. Um z. B. festzulegen, dass die Regel nicht für Code innerhalb abgeleiteter Typen von ControllerBase ausgeführt werden soll, fügen Sie einer EDITORCONFIG-Datei in Ihrem Projekt das folgende Schlüssel-Wert-Paar hinzu:

dotnet_code_quality.CA5391.exclude_aspnet_core_mvc_controllerbase = true

Pseudocodebeispiele

Ohne Verletzung des Antifälschungstokenattributs

using Microsoft.AspNetCore.Mvc;

class ExampleController : Controller
{
    [HttpDelete]
    public IActionResult ExampleAction (string actionName)
    {
        return null;
    }

    [ValidateAntiForgeryToken]
    [HttpDelete]
    public IActionResult AnotherAction (string actionName)
    {
        return null;
    }
}

Ohne gültigen globalen Antifälschungsfilter

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

Markiert mit einer Antifälschungstokenattribut-Lösung

using Microsoft.AspNetCore.Mvc;

class ExampleController : Controller
{
    [ValidateAntiForgeryToken]
    [HttpDelete]
    public IActionResult ExampleAction ()
    {
        return null;
    }

    [ValidateAntiForgeryToken]
    [HttpDelete]
    public IActionResult AnotherAction ()
    {
        return null;
    }
}

Verwenden eines gültigen globalen Antifälschungsfilters

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