web-dev-qa-db-fra.com

Comment fonctionne le jeton XSRF par demande? (Solution angulaire)

Je souhaite protéger mon application contre XSRF. Bien que je ne puisse pas vraiment comprendre quel est le problème et comment fonctionne ma solution, après quelques recherches, j'ai trouvé une solution, qui Angular utilise. Pour autant que j'ai obtenu, ma solution nécessite le Etapes suivantes:

  • Le client envoie une demande pour mon SPA.
  • J'envoie un jeton XSRF (pas uniquement HTTP pour que JS puisse le lire). J'enregistre également ce jeton XSRF dans la session des utilisateurs sur le serveur.
  • Pour chaque POST, je veux que mon client lise le jeton XSRF et définisse un X-XSRF-TOKEN en-tête de ce jeton.
  • Je vérifierai chaque demande en vérifiant si l'en-tête de demande et la session utilisateur-jeton XSRF correspondent. S'ils le font, je vérifierai également JWT pour l'authentification si j'ai besoin.
  • Après avoir validé le jeton XSRF, je vais apporter des modifications à la base de données. Je vais également modifier à nouveau le jeton XSRF, envoyer le nouveau jeton à l'utilisateur et changer le jeton pour la session.

Mais je ne sais pas comment cela aide, si j'ai une vulnérabilité XSS, car tout code JavaScript injecté pourrait également faire la même chose. Je veux comprendre le problème et comment une telle solution aide.

Pour info, j'implémente également l'authentification basée sur JWT, en utilisant Redis pour la gestion de session, sur un serveur Express.

12
FurkanO

Le plan est-il bon?

Votre plan me semble bien. L'utilisation d'un jeton CSRF est la solution standard à ce type de problème. Mais vous ne devriez pas vous sentir en sécurité simplement parce qu'un inconnu sur Internet vous dit que ça a l'air bien - assurez-vous de comprendre ce que vous faites et pourquoi, sinon vous risquez de faire des erreurs.

(Un point mineur: je ne suis pas sûr que vous ayez besoin de changer le jeton à chaque demande.)

Alors pourquoi ça marche?

De cette ancienne réponse à moi:

L'agresseur dupe la victime de lui rendre visite http://evil.com qui contient un formulaire qui effectue automatiquement un POST to http://bank.com/transfer?to=evilHacker&amount=1000000. Si la victime est déjà connectée à sa banque, le cookie avec l'ID de session sera envoyé comme d'habitude par le navigateur et il n'y a aucun moyen pour le serveur de banque de savoir que la victime n'avait pas réellement l'intention de transférer de l'argent. Notez que cela dépend du navigateur qui envoie le cookie avec l'ID de session à bank.com.

Alors, comment un jeton CSRF peut-il aider? Si la bank.com vérifie toujours qu'un jeton aléatoire unique à cette session est présent dans la demande, evil.com ne peut pas falsifier la demande car le pirate malveillant qui exécute ce site ne sait pas ce qu'est le jeton.

Mais qu'en est-il de XSS?

Comme vous le dites dans votre question, cela n'aidera pas s'il existe une vulnérabilité XSS. En fait, il n'y a pas de protection CSRF qui vous aidera dans ce cas, mais si vous êtes vulnérable à XSS, vous avez de plus gros problèmes que les tokens CSRF volés.

La seule chose à faire ici est donc de travailler sur votre protection XSS.

10
Anders