Je passais juste à travers la triche de l'Owasp pour la prévention de la CSRF. En ce qui concerne la méthode Double Soumettre la méthode de cookies , il dit:
le site devrait générer une valeur de pseudorandom (cryptographiquement forte)
Cette méthode repose complètement sur le fait que le cookie/en-tête ne peut pas être injecté par l'attaquant.
Un attaquant ne peut lire aucune donnée envoyée à partir du serveur ni modifier les valeurs de cookies, par la même stratégie d'origine.
Ensuite, pourquoi la pseudo-aléatoire devrait-elle être cryptographique?
Réponse courte: pour empêcher la brute de forcer le jeton CSRF.
Prenons un exemple trivial: disons que votre jeton est une seule chiffre, acceptant des valeurs de 0 à 9.
Maintenant sûr, un attaquant ne peut pas lire cette valeur de la cookie ou de l'en-tête, mais elle ne doit pas nécessairement que l'attaque envoie 10 demandes de CSRF, une avec chaque valeur possible. L'un d'entre eux sera correct.
L'utilisation d'une valeur aléatoire cryptographiquement forte empêchera cela et peut empêcher l'attaquant d'essayer d'accabler cette attaque (en ayant l'attaque d'envoi de 1000 demandes au lieu de 10, ou 10 000, ou ...)
Combinant le meilleur des deux réponses:
La longueur du jeton doit être proportionnelle au nombre de victimes et au nombre de demandes par victime. Si un attaquant convainc X
victimes de naviguer sur sa page (à titre de spam ou d'attaques de phishing) et chacune tentative de cette page tente Y
Différents jetons, vous devez vous protéger contre 2x * y attaques. Par exemple, si votre longueur de jeton est de 16 bits de long, un attaquant doit envoyer 216 emails qui tentent 1 jeton chacun, ou 28 emails qui tentent 28 jetons chacun. Un attaquant peut tester plusieurs jetons en un seul clic à l'aide de JavaScript ou en incorporant plusieurs liaisons d'image malveillantes par page.
Vous souhaitez utiliser un générateur de nombres aléatoires cryptographiquement sécurisé pour empêcher les attaquants de demander des jetons multiples eux-mêmes, puis utilisez la séquence qu'ils doivent prédire quels jetons Autres Les utilisateurs entreront dans un proche avenir.
Cela doit juste être pseudo aléatoire .
Le CSRF n'est pas compatible avec des attaques de force brute. Considérez le vecteur d'attaque:
Il n'y a aucun moyen qu'un pirate informatique va tromper quiconque en cliquant sur un lien des centaines de fois. Même si c'est un script qui envoie une tonne de demandes en un seul clic (en supposant que le pirate informatique a compris comment faire cela-- Navigateurs ne permettez pas à cross-domain AJAX Demandes, donc nous 'Re probablement en train de parler d'une page contenant des centaines de gifs clairs ou quelque chose d'autre totalement gonflé), il ne sera pas en mesure de passer à travers un grand nombre d'espaces de recherche sans chronométrer.
En outre, l'attaquant n'a aucun moyen de déterminer si l'attaque a fonctionné pour une valeur particulière-- C'est un "feu et oublie" attaque.
Donc, l'idée que le jeton CSRF peut être brut forcé est beaucoup extrait au mieux. Le pirate informatique devrait être personnellement connecté, qui est entièrement une attaque différente.
La seule raison pour laquelle vous avez besoin de tout entropie est vraiment, car les attaques CSRF ont tendance à être livrées via le spam. Disons que vous êtes un idiot et votre jeton CSRF ne dispose que de 16 bits d'entropie et le pirate informatique a envoyé 65 536 spams avec le même jeton. 65536/2 ^ 16 = -n de ces attaques réussirait réellement. En supposant que 0% des courriels ont frappé les filtres anti-spam, 100% des utilisateurs les ont ouvert et 100% des utilisateurs se sont connectés à votre application pour le moment où ils ont cliqué sur le lien pervers.
Autre que l'espoir à la ventouse dans une tonne d'utilisateurs, il n'ya aucun moyen de mettre à l'échelle de l'attaque suffisamment grande pour l'appeler une attaque de force brute avec aucune signification.