CSRF: puis-je utiliser un cookie?
Est-il correct de mettre le jeton CSRF dans un cookie? (et dans toutes les formes, comme un caché d'entrée, afin que je puisse vérifier si elles correspondent, bien sûr), j'ai entendu quelqu'un dire que de le faire, beats tout l'objet de la marque, même si je ne comprends pas pourquoi. Il semble sûr de moi.
Et si elle est sécurisée, c'est moins en sécurité que puting le jeton dans l'URL ?
Est-il une autre méthode?
Où puis-je lire plus sur le sujet?
Mise à JOUR: jusqu'à présent, personne ne peut me dire comment est le témoin de la méthode d'insécurité, si elle a encore de faire correspondre le jeton de la forme, que l'attaquant ne devrait pas être en mesure d'obtenir, à moins qu'il utilise un autre hack comme XSS, qui est une question différente, et ne peut toujours pas faire la différence entre l'utilisation de cookies et jeton d'url.
Mise à JOUR 2: Ok, on dirait que certains célèbres cadres de l'utilisation de cette méthode, donc ça devrait être bon. Grâce
- Le double-soumettre les cookies approche fonctionne, mais méfiez-vous de la implications pour la sécurité d'une telle approche.
Vous devez vous connecter pour publier un commentaire.
L'utilisation de cookies œuvres, et est une pratique courante (e. g. Django utilise). L'attaquant ne peut pas lire ou modifier la valeur du cookie en raison de la même origine, de la politique, et ne peut donc pas deviner la bonne GET/POST paramètre.
Découvrez la Chiffré Jeton De Modèle, ce qui permet d'apatride, de la protection CSRF sans avoir besoin de stocker des jetons sur le serveur.
"CSRF fonctionne parce que de nombreux sites utilisent des demandes pour exécuter des commandes.", donc, beaucoup de sites ne pas utiliser la méthode GET comme prévu, parce que ces demandes doivent être idempotent: voir la rfc2616.
"Le CSRF paramètre est déjà là dans le cookie, et il est envoyé le long de la session.", alors, comment?
Le cookie n'est utilisé a un jeton de stockage, comme les DOM lorsque nous avons créé la marque dans un champ caché. Un morceau de code javascript doit obtenir la valeur du jeton de ce cookie, et le définir comme un paramètre dans l'URL, le corps de la requête ou dans l'entête de la requête. Il sera sur le serveur avec la valeur stockée dans la session. C'est le Django façon de gérer le jeton CSRF.
Javascript ne peut pas accéder au cookie d'un autre domaine, en raison de la croix domaine de la protection du navigateur, donc je ne sais pas comment un utilisateur malveillant peut forcer quelqu'un à envoyer le bon jeton d'une fausse demande. Avec une XSS, oui, mais XSS la défaite de la commune CSRF des contre-mesures.
Je préfère donner cette précision, parce que je pense que c'est une question importante et pas facile à gérer.
Requête GET doit être utilisé pour obtenir une ressource et/ou l'affichage de ses données, il ne doit pas être utilisé pour changer son état (de suppression, de la propriété d'incrémentation ou de toute modification).
La validation CSRF doit être fait côté serveur, il semble être évident, mais je l'ai mis comme un rappel. Cette méthode ne peut pas être un vecteur d'attaque si vous observez cette recommandations.
idempotent != safe
. Par exempleGET http://example.com/api/item/123/delete
pourrait être mise en œuvre idempotent (qui est, le résultat est identique, peu importe si le GET est soumis 1,2,3,..., ou N fois).GET
doit seulement être utilisé pour les demandes visible sans effets secondaires, mais quelqu'un a la lecture de la spécification HTTP peut-être à la suite de la "quantité" de la partie, ce qui permet pour plus d'effets.Si vous décidez de mettre le CSRF token dans un cookie alors n'oubliez pas de marquer le cookie comme
HttpOnly
. Si votre site a un cross site scripting vulnerability le hacker ne pas être en mesure de lire les CSRF token. Vous pouvez vérifier les cookies qui peuvent être lus par JavaScript à l'aide de la commandeconsole.log(document.cookie)
dans n'importe quel navigateur moderne de la console. Si vous avez des cookies de session ou sensibles à ces cookies doivent également être marqués commeHttpOnly
.Pour en savoir plus:
https://www.owasp.org/index.php/HttpOnly
À l'aide d'un cookie ayant pour but de CSRF. Voici pourquoi:
CSRF fonctionne parce que de nombreux sites utilisent des demandes pour de l'exécution des commandes. Donc, dire que Bob a une sorte de web d'administration de compte et qu'il est connecté à celle-ci. Une demande peut être effectué comme:
http://somesite.com/admin/whatever.php?request=delete_record&id=4
Alors maintenant, Bob obtient lié à une attaque de site (quelqu'un essaie de jouer avec ses données). L'attaquant des charges de l'URL ci-dessus dans une image, sans doute avec un autre ID et supprime certains autres documents. Le navigateur charge parce que Bob est déjà connecté à son admin du site donc il a une session valide.
CSRF cherche à éliminer ce problème en ajoutant un paramètre secure à la transaction. Ce paramètre doit tourner sur chaque demande et ensuite être renvoyé par le navigateur. Faire de l'URL ressemble à quelque chose comme ceci:
http://somesite.com/admin/whatever.php?request=delete_record&id=4&csrf=<some long checksum>
L'idée est que, désormais, l'attaquant de deviner "certains long de la somme de contrôle" pour créer une attaque. Et si la somme de contrôle tourne sur chaque demande et il doit être pratiquement impossible.
MAIS si vous stockez de la somme de contrôle dans un cookie, vous êtes de retour à la case 1. L'attaquant n'a plus à le deviner. Il a juste de l'artisanat de l'URL d'origine. Les CSRF paramètre est déjà là dans le cookie, et il est envoyé le long de la session. Il n'arrête pas de la précarité du comportement de se produire.
document.getElementById(1).submit()
pour envoyer automatiquement le formulaire lors de ses vues.