Objectif, explication et exemple de ValidateAntiForgeryToken

310

Pourriez-vous expliquer le but de ValidateAntiForgeryToken et me montrer un exemple ValidateAntiForgeryTokendans MVC 4?

Je n'ai trouvé aucun exemple expliquant cet attribut?

Tabriz Atayi
la source
8
Consultez cet article prideparrot.com/blog/archive/2012/7/…
VJAI
1
Soit dit en passant, je ne comprends vraiment pas pourquoi MS n'a pas permis de mettre cela directement dans l' .BeginFormaide. Donc, cette chose est là automatiquement, comme dans Rails
jazzcat

Réponses:

350

Le support anti-contrefaçon de MVC écrit une valeur unique dans un cookie HTTP uniquement, puis la même valeur est écrite dans le formulaire. Lorsque la page est envoyée, une erreur est générée si la valeur du cookie ne correspond pas à la valeur du formulaire.

Il est important de noter que la fonctionnalité empêche les falsifications de demandes intersites . C'est-à-dire un formulaire d'un autre site qui publie sur votre site dans le but de soumettre du contenu masqué à l'aide des informations d'identification d'un utilisateur authentifié. L'attaque consiste à inciter l'utilisateur connecté à soumettre un formulaire ou à déclencher simplement un formulaire par programme lors du chargement de la page.

La fonctionnalité n'empêche aucun autre type d'attaque basée sur la falsification ou la falsification de données.

Pour l'utiliser, décorez la méthode d'action ou le contrôleur avec l' ValidateAntiForgeryTokenattribut et passez un appel à @Html.AntiForgeryToken()dans les formulaires de publication dans la méthode.

Richard Szalay
la source
5
@Chris C'est les deux. Selon ma réponse: "écrit une valeur unique dans un cookie HTTP uniquement, puis la même valeur est écrite dans le formulaire "
Richard Szalay
21
Pourquoi ce paramètre n'est-il pas défini par défaut?
Christian Hagelid
12
@Christian parce que ce n'est pas Ruby on Rails. ;-)
Martin Capodici
6
Il semble que la forme __RequestVerificationToken et le cookie __RequestVerificationToken ne sont pas les mêmes, ils fonctionnent en paire.
WaiKit Kung du
5
@rdans Pas du tout, CORS et CSRF sont complètement différents. CORS est pour permettre à d'autres domaines d'accéder aux API sur votre serveur, CSRF consiste à s'assurer qu'un post de formulaire provient de la page que vous attendiez.
Richard Szalay
52

L'objectif de base de l'attribut ValidateAntiForgeryToken est d'empêcher les attaques de contrefaçon de demande intersite.

Une falsification de demande intersite est une attaque dans laquelle un élément de script nuisible, une commande malveillante ou un code est envoyé depuis le navigateur d'un utilisateur de confiance. Pour plus d'informations à ce sujet, veuillez visiter http://www.asp.net/mvc/overview/security/xsrfcsrf-prevention-in-aspnet-mvc-and-web-pages .

Il est simple à utiliser, vous devez décorer la méthode avec l'attribut ValidateAntiForgeryToken comme ci-dessous:

[HttpPost]  
[ValidateAntiForgeryToken]  
public ActionResult CreateProduct(Product product)  
{
  if (ModelState.IsValid)  
  {
    //your logic 
  }
  return View(ModelName);
}

Il est dérivé de l'espace de noms System.Web.Mvc.

Et à votre avis, ajoutez ce code pour ajouter le jeton afin qu'il soit utilisé pour valider le formulaire lors de la soumission.

@Html.AntiForgeryToken()
Chandra Malla
la source
Oui, vous avez raison, vous devez appeler @ Html.AntiForgeryToken () à partir de votre formulaire et ajouter ValidateAntiForgeryTokenAttribute à la méthode d'action que vous souhaitez protéger.
Chandra Malla
Merci pour cette réponse simple à comprendre :)
noobprogrammer
4

Dans ASP.Net Core, le jeton anti contrefaçon est automatiquement ajouté aux formulaires, vous n'avez donc pas besoin d'ajouter @Html.AntiForgeryToken()si vous utilisez un élément de formulaire de rasoir ou si vous utilisez IHtmlHelper.BeginForm et si la méthode du formulaire n'est pas GET.

Il générera un élément d'entrée pour votre formulaire similaire à ceci: <input name="__RequestVerificationToken" type="hidden" value="CfDJ8HSQ_cdnkvBPo-jales205VCq9ISkg9BilG0VXAiNm3Fl5Lyu_JGpQDA4_CLNvty28w43AL8zjeR86fNALdsR3queTfAogif9ut-Zd-fwo8SAYuT0wmZ5eZUYClvpLfYm4LLIVy6VllbD54UxJ8W6FA">

Et lorsque l'utilisateur soumet un formulaire, ce jeton est vérifié côté serveur si la validation est activée.

[ValidateAntiForgeryToken]l'attribut peut être utilisé contre des actions. Les demandes adressées à des actions auxquelles ce filtre est appliqué sont bloquées, sauf si la demande comprend un jeton antiforgery valide.

[AutoValidateAntiforgeryToken]l'attribut peut être utilisé contre les contrôleurs. Cet attribut fonctionne de manière identique à l'attribut ValidateAntiForgeryToken, sauf qu'il ne nécessite pas de jetons pour les demandes effectuées à l'aide des méthodes HTTP suivantes: GET HEAD OPTIONS TRACE

Informations supplémentaires: https://docs.microsoft.com/pl-pl/aspnet/core/security/anti-request-forgery

ciseaux
la source
2

Microsoft nous fournit des fonctionnalités intégrées que nous utilisons dans notre application à des fins de sécurité, afin que personne ne puisse pirater notre site ou envahir certaines informations critiques.

Du but de ValidateAntiForgeryToken dans l'application MVC par Harpreet Singh:

Utilisation de ValidateAntiForgeryToken

Essayons avec un exemple simple de comprendre ce concept. Je ne veux pas compliquer les choses, c'est pourquoi je vais utiliser un modèle d'application MVC, déjà disponible dans Visual Studio. Nous ferons cela étape par étape. Commençons.

  1. Étape 1 - Créez deux applications MVC avec le modèle Internet par défaut et donnez ces noms respectivement CrossSite_RequestForgery et Attack_Application.

  2. Maintenant, ouvrez la configuration Web de l'application CrossSite_RequestForgery et modifiez la chaîne de connexion avec celle indiquée ci-dessous, puis enregistrez.

"

<connectionStrings> <add name="DefaultConnection" connectionString="Data Source=local\SQLEXPRESS;Initial Catalog=CSRF;
Integrated Security=true;" providerName="System.Data.SqlClient" /> 
 </connectionStrings>
  1. Maintenant, cliquez sur Outils >> NuGet Package Manager, puis sur Package Manager Console

  2. Maintenant, exécutez les trois commandes mentionnées ci-dessous dans la console du gestionnaire de packages pour créer la base de données.

Enable-Migrations add-migration first update-database

Notes importantes - J'ai créé une base de données avec une approche en premier code parce que je veux faire cet exemple dans la façon dont les développeurs travaillent. Vous pouvez également créer une base de données manuellement. C'est ton choix.

  1. Maintenant, ouvrez le contrôleur de compte. Ici, vous verrez une méthode d'enregistrement dont le type est post. Au-dessus de cette méthode, il devrait y avoir un attribut disponible en tant que [ValidateAntiForgeryToken]. Commentez cet attribut. Maintenant, faites un clic droit sur s'inscrire et cliquez sur Aller à la vue. Là encore, vous trouverez un assistant html comme @ Html.AntiForgeryToken (). Commentez celui-ci également. Exécutez l'application et cliquez sur le bouton d'enregistrement. L'URL sera ouverte comme:

http: // localhost: 52269 / Account / Register

Notes - Je sais maintenant que la question qui se pose dans l'esprit de tous les lecteurs est de savoir pourquoi ces deux assistants doivent être commentés, car tout le monde sait qu'ils sont utilisés pour valider la demande. Ensuite, je veux juste vous faire savoir que c'est juste parce que je veux montrer la différence après et avant d'appliquer ces aides.

  1. Maintenant, ouvrez la deuxième application qui est Attack_Application. Ensuite, ouvrez la méthode Register de Account Controller. Modifiez simplement la méthode POST avec la méthode simple, illustrée ci-dessous.

    Formulaire d'inscription
    1. @ Html.LabelFor (m => m.UserName) @ Html.TextBoxFor (m => m.UserName)
    2. @ Html.LabelFor (m => m.Password) @ Html.PasswordFor (m => m.Password)
    3. @ Html.LabelFor (m => m.ConfirmPassword) @ Html.PasswordFor (m => m.ConfirmPassword)

Supposons maintenant que vous êtes un pirate informatique et que vous connaissez l'URL d'où vous pouvez enregistrer l'utilisateur dans l'application CrossSite_RequestForgery. Maintenant, vous avez créé un site de contrefaçon en tant que Attacker_Application et venez de mettre la même URL dans la méthode post.

8.Lancez cette application maintenant et remplissez les champs d'inscription et cliquez sur s'inscrire. Vous verrez que vous êtes inscrit dans l'application CrossSite_RequestForgery. Si vous vérifiez la base de données de l'application CrossSite_RequestForgery, vous verrez et l'entrée que vous avez entrée.

  1. Important - Maintenant, ouvrez l'application CrossSite_RequestForgery et commentez le jeton dans le contrôleur de compte et enregistrez la vue. Essayez de vous enregistrer à nouveau avec le même processus. Ensuite, une erreur se produira comme ci-dessous.

Erreur serveur dans l'application '/' ________________________________________ Le cookie anti-contrefaçon requis "__RequestVerificationToken" n'est pas présent.

C'est ce que dit le concept. Ce que nous ajoutons dans View ie @ Html.AntiForgeryToken () génère __RequestVerificationToken au moment du chargement et [ValidateAntiForgeryToken] disponible sur la méthode Controller. Faites correspondre ce jeton à l'heure de la publication. Si le jeton est le même, cela signifie que c'est une demande valide.

Vinayak Savale
la source
3
copié depuis c-sharpcorner.com/article/…
Mohammed Dawood Ansari