Ce qui se passe
Lorsque l'utilisateur affiche un formulaire pour créer, mettre à jour, ou de détruire une ressource, l'application Rails crée un random authenticity_token
, les magasins de ce jeton dans la session, et le place dans un champ caché dans le formulaire. Lorsque l'utilisateur soumet le formulaire, Rails de recherche de l' authenticity_token
, le compare à celui stocké dans la session, et si elles correspondent à la demande est autorisé à continuer.
Pourquoi ça arrive
Depuis l'authenticité jeton est stocké dans la session, le client ne peut pas connaître sa valeur. Cela empêche les gens de soumettre des formulaires à une application Rails, sans affichage de la forme à l'intérieur de l'application elle-même.
Imaginez que vous utilisez Un service, vous vous êtes connecté dans le service et tout est ok. Maintenant, imaginez que vous êtes allé à l'utilisation du service de B, et que vous avez vu une image qui vous plaît, et appuyé sur l'image pour afficher une taille plus grande. Maintenant, si un mauvais code est là au service de B, il peut envoyer une demande de service (que vous êtes connecté), et demander la suppression de votre compte, en envoyant une demande à l' http://serviceA.com/close_account
. C'est ce qui est connu comme CSRF (Cross Site Request Forgery).
Si Un service est l'aide de l'authenticité des jetons, ce vecteur d'attaque n'est plus applicable, car la demande de service B ne contient pas le bon authenticité jeton, et ne sera pas autorisé à continuer.
Notes
Gardez à l'esprit, Rails seuls les chèques POST, PUT et DELETE demandes. OBTENIR la demande ne sont pas vérifié l'authenticité de jeton. Pourquoi? parce que la spécification HTTP états qui OBTIENNENT les demandes doivent pas créer, modifier ou détruire des ressources au niveau du serveur, et la demande doit être idempotent (si vous exécutez la même commande à plusieurs reprises, vous devriez obtenir le même résultat à chaque fois).
Leçons
Utiliser authenticity_token
afin de protéger vos POST, PUT et DELETE demandes. Assurez-vous également de ne pas permettre à toute demande qui pourrait potentiellement modifier les ressources sur le serveur.
EDIT: Vérifiez le commentaire de @erturne concernant des demandes d'être idempotent. Il l'explique dans une meilleure façon que j'ai fait ici.