J'écris une application (Django, ça arrive) et je veux juste une idée de ce qu'est réellement un "token CSRF" et comment il protège les données. Les données de publication ne sont-elles pas sûres si vous n'utilisez pas de jetons CSRF?
629
Réponses:
Cross-Site Request Forgery (CSRF) en quelques mots
www.mybank.com
mybank.com
entraînera une demande (conceptuelle) du formulairehttp://www.mybank.com/transfer?to=<SomeAccountnumber>;amount=<SomeAmount>
. (Votre numéro de compte n'est pas nécessaire, car il est impliqué par votre connexion.)www.cute-cat-pictures.org
, sans savoir qu'il s'agit d'un site malveillant.mybank.com
(nécessite un peu de chance!), Il pourrait inclure sur sa page une demande commehttp://www.mybank.com/transfer?to=123456;amount=10000
(où123456
est le numéro de son compte aux îles Caïmans) et10000
est un montant que vous pensiez auparavant être heureux de posséder).www.cute-cat-pictures.org
page, donc votre navigateur fera cette demande.www.mybank.com
cookie et elle semblera parfaitement légitime. Voilà votre argent!C'est le monde sans jetons CSRF .
Maintenant, pour le meilleur avec les jetons CSRF :
http://www.mybank.com/transfer?to=123456;amount=10000;token=31415926535897932384626433832795028841971
.mybank.com
sera inclus sur leur propre page Web lorsqu'ils vous le serviront. C'est différent chaque fois qu'ils servent une page à qui que ce soit.www.mybank.com
.Résultat: vous conservez vos
10000
unités monétaires. Je vous suggère d'en faire don à Wikipedia.(Votre kilométrage peut varier.)
MODIFIER un commentaire qui mérite d'être lu:
Il serait intéressant de noter que le script de
www.cute-cat-pictures.org
normalement n'a pas accès à votre jeton anti-CSRF àwww.mybank.com
cause du contrôle d'accès HTTP. Cette note est importante pour certaines personnes qui envoient de manière déraisonnable un en-têteAccess-Control-Allow-Origin: *
pour chaque réponse de site Web sans savoir à quoi elles servent, simplement parce qu'elles ne peuvent pas utiliser l'API d'un autre site Web.la source
www.cute-cat-pictures.org
normalement n'a pas accès à votre jeton anti-CSRF àwww.mybank.com
cause du contrôle d'accès HTTP. Cette note est importante pour certaines personnes qui envoient de manière déraisonnable un en-têteAccess-Control-Allow-Origin: *
pour chaque réponse de site Web sans savoir à quoi elles servent, simplement parce qu'elles ne peuvent pas utiliser l'API d'un autre site Web.Oui, les données de publication sont en sécurité. Mais l'origine de ces données ne l'est pas. De cette façon, quelqu'un peut inciter un utilisateur avec JS à se connecter à votre site, tout en parcourant la page Web de l'attaquant.
Afin d'éviter cela, django enverra une clé aléatoire à la fois dans le cookie et les données du formulaire. Ensuite, lorsque les utilisateurs effectueront des POST, il vérifiera si deux clés sont identiques. Dans le cas où l'utilisateur est trompé, le site Web tiers ne peut pas obtenir les cookies de votre site, provoquant ainsi une erreur d'authentification.
la source
Le site génère un jeton unique lorsqu'il crée la page de formulaire. Ce jeton est requis pour publier / récupérer des données sur le serveur.
Étant donné que le jeton est généré par votre site et fourni uniquement lorsque la page avec le formulaire est générée, certains autres sites ne peuvent pas imiter vos formulaires - ils n'auront pas le jeton et ne pourront donc pas publier sur votre site.
la source
Le blog Cloud Under a une bonne explication des jetons CSRF.
la source
La racine de tout cela est de s'assurer que les demandes proviennent des utilisateurs réels du site. Un jeton csrf est généré pour les formulaires et doit être lié aux sessions de l'utilisateur. Il est utilisé pour envoyer des requêtes au serveur, dans lequel le jeton les valide. C'est une façon de se protéger contre csrf, une autre serait de vérifier l'en-tête du référent.
la source