Ai-je besoin d'un jeton CSRF pour jQuery .ajax()?
Donc j'ai une base .ajax() méthode POST pour un fichier PHP.
Ce que les mesures de sécurité dont j'ai besoin?
Quelques postes dans les environs ont été de mentionner à l'aide d'un caché MD5 champ de saisie que vous envoyez via AJAX et vérifiez dans le fichier PHP. Est-ce une bonne méthode?
Vous devez vous connecter pour publier un commentaire.
Le risque de CSRF est qu'un site externe peut envoyer des données à la vôtre et les utilisateurs, le navigateur va automatiquement envoyer le cookie d'authentification avec elle.
Ce que vous avez besoin est d'une certaine façon pour la réception de l'action (que votre
$.ajax()
méthode est d'envoyer des données POST à l') pour être en mesure de vérifier que la demande est venue à partir d'une autre page sur votre site, plutôt que sur un site externe.Il ya un couple de façons de le faire, mais il est recommandé d'ajouter un jeton à la demande que vous pouvez vérifier et que les pirates ne peuvent pas l'obtenir.
À sa plus simple:
$.ajax()
requête qui contient le jeton.Le pirate ne peut pas obtenir à votre base de données et ne peuvent pas lire la page que vous avez envoyé à l'utilisateur (à moins qu'ils obtiennent une attaque XSS, mais c'est un autre problème) ne peut donc pas usurper le jeton.
Tout ce qui compte avec le jeton est que vous pouvez prédire (et valider) et que le hacker peut pas.
Pour cette raison, il est plus facile à générer quelque chose de long et aléatoire et de le stocker dans la base de données, mais vous pouvez construire quelque chose de cryptés la place. Je ne serait pas juste MD5 le nom d'utilisateur - si le CSRF attaquants comprendre comment générer vos jetons, vous allez être piraté.
Une autre façon est de stocker le jeton est dans un cookie (plutôt que de votre base de données), que les attaquants ne peuvent pas lire ou modifier vos cookies, les amener à être ré-envoyé. Vous êtes le jeton dans le HTTP POST de données correspond à un jeton dans le cookie.
Vous pouvez le faire beaucoup plus sophistiqué, par exemple un jeton qui change à chaque fois que c'est utilisé avec succès (la prévention d'une nouvelle présentation) ou d'un jeton spécifique à l'utilisateur et de l'action, mais c'est le modèle de base.
<img>
tag sur une page web) et ça marchera. @Keith je n'aurais pas confiance en un cookie est automatiquement le navigateur envoie le cookie à la page web pour chaque demande. Si l'attaquant utilise une iFrame ou la soumission d'un formulaire, le cookie sera automatiquement envoyé, je crois.$_REQUEST['token'] = 'hi'; $_HEADER['token'] = 'hi;
En termes de falsification de requête, il n'a pas d'importance comment le client envoie la requête importe la façon dont son reçu. La même CSRF règles s'appliquent pour un ajax post que tout autre type de poste.
Je vous recommande la lecture du CSRF de prévention de la feuille de triche. À l'aide d'un utilisateur par jeton secret est la forme la plus commune de la protection.
Aucun jeton est nécessaire, mais vous devriez tout de même de protéger toutes les fonctions qui changent d'état contre les CSRF.
Une façon simple de le faire est d'ajouter un en-tête qui est envoyé avec la requête AJAX. Pas de hasard jeton est nécessaire.
Cela fonctionne parce que:
Bien sûr, le code côté serveur doit veiller à ce que l'en-tête est présent avant l'exécution de l'action.
Plus d'infos: Quel est le point de la X-requested-with-tête?
Voici une simple démo, vous pouvez essayer de django:
Sur la page HTML
Java-Script Code