CA5391: Hamisítás elleni tokenek használata ASP.NET Core MVC-vezérlőkben

Tulajdonság Érték
Szabályazonosító CA5391
Cím Antiforgery tokenek használata ASP.NET Core MVC-vezérlőkben
Kategória Biztonság
A javítás romboló vagy nem romboló Nem törhető
Alapértelmezés szerint engedélyezve a .NET 10-ben Nem
Alkalmazandó nyelvek C# és Visual Basic

Ok

A módosítást eredményező műveletek nem rendelkeznek antiforgery token attribútummal. Vagy globális hamisítás elleni jogkivonat-szűrő használata a várt hamisítás elleni jogkivonat-függvények meghívása nélkül.

Szabály leírása

A POST, PUT, PATCH vagy DELETE kérések hamisítás elleni jogkivonat érvényesítése nélkül történő kezelése sebezhető lehet keresztoldali kéréshamisítási támadásokkal szemben. A webhelyek közötti kérelemhamisítási támadás rosszindulatú kéréseket küldhet egy hitelesített felhasználó nevében az ASP.NET Core MVC-vezérlőhöz.

Szabálysértések kijavítása

Mikor kell letiltani a figyelmeztetéseket?

Ezt a szabályt nyugodtan letilthatja, ha más megoldásokat alkalmaznak a CSRF sérülékenységeinek enyhítésére, nem az antiforgery token attribútumok használatával. További információ: A helyek közötti kérelemhamisítás (XSRF/CSRF) támadásainak megakadályozása a ASP.NET Core-ban.

Figyelmeztetés mellőzése

Ha csak egyetlen szabálysértést szeretne letiltani, adjon hozzá előfeldolgozási irányelveket a forrásfájlhoz a szabály letiltásához és újbóli engedélyezéséhez.

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

Ha le szeretné tiltani egy fájl, mappa vagy projekt szabályát, állítsa annak súlyosságát none a konfigurációs fájlban.

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

További információ: Kódelemzési figyelmeztetések letiltása.

Kód konfigurálása elemzéshez

Konfigurálhatja, hogy a szabály csak a kódbázis származtatott osztályaira Microsoft.AspNetCore.Mvc.Controller vonatkozik-e. Ha például meg szeretné adni, hogy a szabály ne fusson származtatott típusú ControllerBasekódon, adja hozzá a következő kulcs-érték párot a projekt egyik .editorconfig fájljához:

dotnet_code_quality.CA5391.exclude_aspnet_core_mvc_controllerbase = true

Példák pszeudokódokra

Hamisítás elleni token attribútum megsértése nélkül

using Microsoft.AspNetCore.Mvc;

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

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

Érvényes globális hamisítás elleni szűrő hiányában

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

Hamisítás elleni token attribútum segítségével jelölve

using Microsoft.AspNetCore.Mvc;

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

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

Érvényes globális hamisítás elleni szűrő használata

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