Jeton api csrf
Prévention des attaques CSRF (Cross-Site Request Forgery) dans ASP.NET application MVC
La CSRF (Cross-Site Request Forgery) est une attaque où un site malveillant envoie une demande à un site vulnérable où l’utilisateur est actuellement connecté
Voici un exemple d’attaque CSRF :
-
Un utilisateur se connecte à l’aide de l’authentification par formulaire.
-
Le serveur authentifie l’utilisateur.
-
Sans se déconnecter, l’utilisateur visite un site Web malveillant. Ce site malveillant contient le formulaire HTML suivant :
Notez que l’action du formulaire est publiée sur le site vulnérable et non sur le site malveillant. Il s’agit de la partie « inter-sites » du CSRF.
-
L’utilisateur clique sur le bouton Envoyer.
-
La requête s’exécute sur le serveur avec le contexte d’authentification de l’utilisateur et peut faire tout ce qu’un L’utilisateur authentifié est autorisé à le faire.
Bien que cet exemple nécessite que l’utilisateur clique sur le bouton du formulaire, la page malveillante peut tout aussi bien exécuter un script qui soumet le formulaire automatiquement. De plus, l’utilisation de SSL n’empêche pas une attaque CSRF, car le site malveillant peut envoyer une requête « https:// ».
Par exemple, l’authentification de base et l’authentification Digest sont également vulnérables. Une fois qu’un utilisateur s’est connecté avec l’authentification Basic ou Digest. Le navigateur envoie automatiquement les informations d’identification jusqu’à la fin de la session.
Pour
aider à prévenir les attaques CSRF, ASP.NET MVC utilise des jetons anti-falsification, également appelés jetons de vérification de demande.
- Le client demande une page HTML contenant un formulaire.
- Le serveur inclut deux jetons dans la réponse. L’autre est placé dans un champ de formulaire masqué. Les jetons sont générés de manière aléatoire de sorte qu’un adversaire ne peut pas deviner les valeurs.
- Lorsque le client soumet le formulaire, il doit renvoyer les deux jetons au serveur. (Un client de navigateur effectue automatiquement cette opération lorsque l’utilisateur soumet le formulaire.)
- Si une requête n’inclut pas les deux jetons, le serveur l’interdit.
Voici un exemple de formulaire HTML avec un jeton de formulaire masqué :
Les jetons anti-falsification fonctionnent car la page malveillante ne peut pas lire les jetons de l’utilisateur, en raison de politiques de même origine. (Les règles de même origine empêchent les documents hébergés sur deux sites différents d’accéder au contenu de l’autre. Ainsi, dans l’exemple précédent, la page malveillante peut envoyer des requêtes à example.com, mais elle ne peut pas lire la réponse.)
Pour éviter les attaques CSRF, utilisez des jetons anti-falsification avec n’importe quel protocole d’authentification où le navigateur envoie silencieusement des informations d’identification une fois que l’utilisateur s’est connecté.
Vous devriez exiger des jetons anti-falsification pour toute méthode non sécurisée (POST, PUT, DELETE). Assurez-vous également que les méthodes sûres (GET, HEAD) n’ont pas d’effets secondaires. De plus, si vous activez la prise en charge inter-domaines, telle que CORS ou JSONP, même les méthodes sûres comme GET sont potentiellement vulnérables aux attaques CSRF, ce qui permet à l’attaquant de lire des données potentiellement sensibles.
Jetons anti-falsification dans ASP.NET MVC
Pour ajouter les jetons anti-falsification à une page Razor, utilisez la méthode d’assistance HtmlHelper.AntiForgeryToken :
Anti-CSRF et AJAX
Le jeton de formulaire peut poser un problème pour les requêtes AJAX, car une requête AJAX peut envoyer des données JSON et non des données de formulaire HTML. Une solution consiste à envoyer les jetons dans un en-tête HTTP personnalisé. Le code suivant utilise la syntaxe Razor pour générer les jetons, puis ajoute les jetons à une requête AJAX. Les jetons sont générés sur le serveur en appelant AntiForgery.GetTokens .
Lorsque vous traitez la demande, extrayez les jetons de l’en-tête de la demande. Appelez ensuite la méthode AntiForgery.Validate pour valider les jetons. La méthode Validate lève une exception si les jetons ne sont pas valides.