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é par défaut dans .NET 8 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 :

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