web-dev-qa-db-fra.com

Dois-je utiliser AntiForgeryToken sous toutes les formes, même pour la connexion et l'enregistrement?

Je gère un site assez grand avec des milliers de visites chaque jour et une base d'utilisateurs assez importante. Depuis que j'ai commencé la migration vers MVC 3, j'ai mis l'AntiForgeryToken sous plusieurs formes, qui modifient les données protégées, etc.

Certains autres formulaires, comme la connexion et l'enregistrement utilisent également l'AntiForgeryToken maintenant, mais je deviens douteux de leur besoin en premier lieu, pour quelques raisons ...

Le formulaire de connexion nécessite que l'affiche connaisse les informations d'identification correctes. Je ne peux pas vraiment penser à aucun avantage d'une attaque CSRF ici, surtout si je vérifie que la demande provient du même hôte (en vérifiant l'en-tête Referer).

Le jeton AntiForgeryToken génère des valeurs différentes à chaque chargement de la page. Si j'ai deux onglets ouverts avec la page de connexion, puis que j'essaie de les publier, le premier sera chargé avec succès. La seconde échouera avec une AntiForgeryTokenException (chargez d'abord les deux pages, puis essayez de les publier). Avec des pages plus sécurisées - c'est évidemment un mal nécessaire, avec les pages de connexion - cela semble exagéré et demande juste des ennuis.

Il y a peut-être d'autres raisons pour lesquelles on devrait utiliser ou ne pas utiliser le jeton dans ses formulaires. Ai-je raison de supposer que l'utilisation du jeton dans chaque formulaire de publication est exagérée, et si c'est le cas - quel type de formulaires en bénéficierait et lesquels ne seraient certainement pas avantage?

P.S. Cette question est également posée sur StackOverflow, mais je ne suis pas entièrement convaincu. Je pensais que je le demanderais ici, pour plus de sécurité couverture

82
Artiom Chilaru

Oui, il est important d'inclure des jetons anti-contrefaçon pour les pages de connexion.

Pourquoi? En raison du potentiel d'attaques "login CSRF". Dans une attaque CSRF de connexion, l'attaquant connecte la victime au site cible avec le compte de l'attaquant. Prenons, par exemple, une attaque contre Alice, qui est une utilisatrice de Paypal, par une méchante attaquante Evelyn. Si Paypal n'a pas protégé ses pages de connexion contre les attaques CSRF (par exemple, avec un jeton anti-contrefaçon), l'attaquant peut connecter silencieusement le navigateur d'Alice au compte d'Evelyn sur Paypal. Alice est dirigée vers le site Web de Paypal et Alice est connectée, mais connectée en tant que Evelyn. Supposons qu'Alice clique ensuite sur la page pour lier sa carte de crédit à son compte Paypal et saisisse son numéro de carte de crédit. Alice pense qu'elle relie sa carte de crédit à son compte Paypal, mais en fait elle l'a liée au compte d'Evelyn. Evelyn peut maintenant acheter des trucs et les faire débiter sur la carte de crédit d'Alice. Oops. C'est subtil et un peu obscur, mais suffisamment sérieux pour que vous puissiez inclure des jetons anti-contrefaçon pour la cible d'action de formulaire utilisée pour vous connecter. Voir ce document pour plus de détails et quelques exemples concrets de tels vulnérabilités.

Quand est-il OK de laisser le jeton anti-contrefaçon? En général, si la cible est une URL et que l'accès à cette URL n'a aucun effet secondaire, vous n'avez pas besoin d'inclure de jeton anti-contrefaçon dans cette URL.

La règle générale approximative est la suivante: inclure un jeton anti-contrefaçon dans toutes les demandes POST, mais vous n'en avez pas besoin pour les demandes GET. Cependant, cette règle générale approximative est une approximation très grossière . Il suppose que les demandes GET seront toutes sans effet secondaire. Dans une application Web bien conçue, cela devrait être le cas, mais dans la pratique, parfois les concepteurs d'applications Web ne suivent pas cette directive et n'implémentent pas de gestionnaires GET. qui ont un effet secondaire (c'est une mauvaise idée, mais ce n'est pas rare). C'est pourquoi je suggère une directive basée sur si la demande aura un effet secondaire sur l'état de l'application web ou non, au lieu de se baser sur GET vs PUBLIER.

72
D.W.

Il peut être nécessaire d'avoir le jeton sur une page de connexion lorsque vous devez empêcher quelqu'un de vous connecter de manière malveillante au site avec des informations d'identification particulières. Je peux voir que c'est le cas si quelqu'un est encadré pour quelque chose qui nécessite une connexion avec un utilisateur particulier. Cela étant dit, c'est un peu un exemple artificiel.

2
Steve