CA5391 : Utiliser des jetons antifalsification dans les contrôleurs ASP.NET Core MVC

Propriété Value
Identificateur de la règle CA5391
Titre Utiliser des jetons antifalsification dans les contrôleurs ASP.NET Core MVC
Catégorie Sécurité
Le correctif est cassant ou non cassant Sans rupture
Activé par défaut dans .NET 8 Non

Cause

Les actions qui entraînent la modification des opérations n’ont pas d’attribut de jeton antifalsification. Vous pouvez également utiliser un filtre de jeton antifalsification global sans appeler les fonctions de jeton antifalsification attendues.

Description de la règle

La gestion d’une requête POST, PUT, PATCHou DELETE sans validation d’un jeton antifalsification peut être vulnérable aux attaques de falsification de requête inter-site. Une attaque par falsification de requête inter-site peut envoyer des demandes malveillantes d’un utilisateur authentifié à votre contrôleur ASP.NET Core MVC.

Comment corriger les violations

Quand supprimer les avertissements

Il est sûr de supprimer cette règle si des solutions autres que l’utilisation d’attributs de jeton antifalsification sont adoptées pour atténuer les vulnérabilités de falsification de requête intersites. Pour plus d’informations, consultez Prévenir les attaques par falsification de requête intersites (XSRF/CSRF) dans ASP.NET Core.

Supprimer un avertissement

Si vous voulez supprimer une seule violation, ajoutez des directives de préprocesseur à votre fichier source pour désactiver et réactiver la règle.

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

Pour désactiver la règle sur un fichier, un dossier ou un projet, définissez sa gravité sur none dans le fichier de configuration.

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

Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.

Configurer le code à analyser

Vous pouvez configurer si la règle s’applique uniquement aux classes dérivées de Microsoft.AspNetCore.Mvc.Controller dans votre codebase. Par exemple, pour spécifier que la règle ne doit pas s’exécuter sur du code dans des types dérivés de ControllerBase, ajoutez la paire clé-valeur suivante à un fichier .editorconfig dans votre projet :

dotnet_code_quality.CA5391.exclude_aspnet_core_mvc_controllerbase = true

Exemples de pseudo-code

Sans violation d’attribut de jeton antifalsification

using Microsoft.AspNetCore.Mvc;

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

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

Sans filtre antifalsification global valide

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

Marqué avec une solution d’attribut de jeton antifalsification

using Microsoft.AspNetCore.Mvc;

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

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

Utilisation d’un filtre antifalsification global valide

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