CA3147 : Marquer les gestionnaires de verbe avec ValidateAntiForgeryToken
Propriété | Value |
---|---|
Identificateur de la règle | CA3147 |
Titre | Marquer les gestionnaires de verbe avec ValidateAntiForgeryToken |
Catégorie | Sécurité |
Le correctif est cassant ou non cassant | Sans rupture |
Activée par défaut dans .NET 9 | Non |
Cause
Une méthode d’action de contrôleur MVC ASP.NET n’est pas marquée avec ValidateAntiForgeryTokenAttribute, ni avec un attribut spécifiant le verbe HTTP, comme HttpGetAttribute ou AcceptVerbsAttribute.
Description de la règle
Lors de la conception d’un contrôleur MVC ASP.NET, tenez compte des attaques de falsification de requête inter-site. Une attaque de falsification de requête inter-site peut envoyer des requêtes malveillantes d’un utilisateur authentifié à votre contrôleur MVC ASP.NET. Pour plus d’informations, consultez Prévention de XSRF/CSRF dans ASP.NET MVC et les pages web.
Cette règle vérifie que les méthodes d’action ASP.NET du contrôleur MVC :
Disposent de ValidateAntiforgeryTokenAttribute et spécifient des verbes HTTP autorisés, sans inclure HTTP GET.
Spécifient HTTP GET comme verbe autorisé.
Comment corriger les violations
Pour les actions de contrôleur MVC ASP.NET qui gèrent les requêtes HTTP GET et n’ont pas d’effets secondaires potentiellement dangereux, ajoutez un HttpGetAttribute à la méthode.
Si vous disposez d’une action de contrôleur MVC ASP.NET qui gère les requêtes HTTP GET et a des effets secondaires potentiellement dangereux, comme la modification de données sensibles, votre application est vulnérable aux attaques de falsification de requêtes intersite. Vous devez reconcevoir votre application afin que seules les requêtes HTTP POST, PUT ou DELETE effectuent des opérations sensibles.
Pour les actions de contrôleur MVC ASP.NET qui gèrent des requêtes HTTP POST, PUT ou DELETE, ajoutez ValidateAntiForgeryTokenAttribute et des attributs spécifiant les verbes HTTP autorisés (AcceptVerbsAttribute, HttpPostAttribute, HttpPutAttribute ou HttpDeleteAttribute). En outre, vous devez appeler la méthode HtmlHelper.AntiForgeryToken() à partir de votre vue MVC ou de votre page web Razor. Pour obtenir un exemple, consultez Examen des méthodes de modification et de la vue de modification.
Quand supprimer les avertissements
Il est sûr de supprimer un avertissement de cette règle si :
- L’action du contrôleur MVC ASP.NET n’a pas d’effets secondaires nocifs.
- L’application valide le jeton antifalsification d’une autre manière.
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 CA3147
// The code that's violating the rule is on this line.
#pragma warning restore CA3147
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.CA3147.severity = none
Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.
Exemple d’attribut ValidateAntiForgeryToken
Violation :
namespace TestNamespace
{
using System.Web.Mvc;
public class TestController : Controller
{
public ActionResult TransferMoney(string toAccount, string amount)
{
// You don't want an attacker to specify to who and how much money to transfer.
return null;
}
}
}
Solution :
using System;
using System.Xml;
namespace TestNamespace
{
using System.Web.Mvc;
public class TestController : Controller
{
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult TransferMoney(string toAccount, string amount)
{
return null;
}
}
}
Exemple d’attribut HttpGet
Violation :
namespace TestNamespace
{
using System.Web.Mvc;
public class TestController : Controller
{
public ActionResult Help(int topicId)
{
// This Help method is an example of a read-only operation with no harmful side effects.
return null;
}
}
}
Solution :
namespace TestNamespace
{
using System.Web.Mvc;
public class TestController : Controller
{
[HttpGet]
public ActionResult Help(int topicId)
{
return null;
}
}
}