2012-10-25 7 views
2

Sur mon site, j'ai un sondage. C'est un sondage basé sur les cookies. Si un utilisateur vote, je crée un cookie avec le sondage en cours, donc il ne peut pas voter jusqu'à ce qu'un nouveau sondage soit créé. Je sais que les utilisateurs peuvent supprimer les cookies et voter à nouveau, mais ce n'est pas le problème ici. J'ai une page ajax.php qui gère le poste ajax. Voici le code:Sondage basé sur les cookies en utilisant PHP et AJAX

if(isset($_COOKIE['poll_id']) && $_COOKIE['poll_id'] == $poll_id) 
{ 
// print message that it is already voted, show the results... 
} 
else 
{ 
// update the database and create a cookie 
} 

Ce code fonctionne bien si le vote est fait sur un clic de bouton. Mais, j'ai commencé un javascript dans Firebug qui fait ceci:

for(var i=0;i<100;i++) { 
    jQuery.post('ajax.php', { 
     //post parameters 
    }); 
} 

Et j'obtiens 100 votes. Si j'exécute à nouveau le script, il échoue, car un cookie est créé, mais il semble que si je fais 100 demandes simultanées, la vérification échoue, car je suppose que le système n'a pas le temps de créer le cookie à temps, donc toutes les mises à jour passent par.

Des suggestions sur comment résoudre ce problème?

+1

La seule chose que je peux penser est étranglant. Vous travaillez d'une manière à autoriser seulement N nombre de votes par ip dans les mêmes secondes. J'aime 1 vote toutes les 5 secondes. Vous devrez enregistrer chaque vote séparément si vous n'êtes pas déjà et stocker IP avec cela. –

Répondre

2

C'est là XSRF vient jouer. Dans votre site, vous devez d'abord créer une chaîne aléatoire (correctement salée et suffisamment sécurisée) et la stocker en session. Dans toutes vos pages, vous devriez obtenir cette valeur de session et la transmettre avec les soumissions de formulaire. Lors de l'examen de la saisie par l'utilisateur, vous devez vérifier cette valeur dans le cadre de la demande de page.

Maintenant si dans la page d'interrogation vous envoyez ceci, et dans ajax.php vous examinez cela, alors vous trouverez cette valeur et vous saurez qu'il s'agit d'une requête sécurisée. Quand quelqu'un essaie quelque chose d'intelligent sur firebug/jquery etc, ils ne pourront pas accéder/envoyer cette valeur, et vos pages peuvent ignorer de telles requêtes.

Bien sûr, mon explication est une simplification excessive pour une meilleure compréhension. Mais lisez-en plus à ce sujet, cela aidera à résoudre votre scénario ainsi que de rendre votre code plus robuste.

Ajout d'un exemple simple de code pseudo:

supposera d'abord votre chaîne de XSRF aléatoire est déjà réglée en session.

jQuery.post('ajax.php', { 
    <?php echo $_SESSION['token'];?>, 
    //rest of the post parameters 
}); 

Maintenant, quand quelqu'un essaie avec Firebug:

for(var i=0;i<100;i++) { 
    jQuery.post('ajax.php', { 
     //post parameters 
     //cannot access $_SESSION['token'] so cannot pass it.. 
    }); 
} 
+0

Je pense que je comprends ce que vous suggérez, mais je n'ai pas de formulaire de soumission, je n'utilise que l'ajax post avec jquery. – Andrej

+1

@Andrej: J'ai ajouté un exemple de pseudo-code simple qui vous aidera à mieux comprendre. – raidenace

+0

Merci, je vais essayer de mettre en œuvre cela! – Andrej

0

Essayez une redirection lorsque vous définissez le cookie, de sorte que l'en-tête Set-Cookie est dans la demande