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ée par défaut dans .NET 9 | 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
, PATCH
ou 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
- Marquez l’action de modification avec un attribut de jeton antifalsification valide :
- Microsoft.AspNetCore.Mvc.ValidateAntiForgeryTokenAttribute.
- Attribut dont le nom est semblable à
%Validate%Anti_orgery%Attribute
.
- Ajoutez l’attribut de jeton antifalsification valide dans le filtre global avec Microsoft.AspNetCore.Mvc.Filters.FilterCollection.Add.
- Ajoutez une classe de filtre antifalsification personnalisée ou fournie par Mvc qui appelle
Validate
sur n’importe quelle classe qui implémente l’interface Microsoft.AspNetCore.Antiforgery.IAntiforgery.
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));
}
}