Interdire le rechargement (F5) d'une page/formulaire

Interdire le rechargement (F5) d'une page/formulaire - PHP - Programmation

Marsh Posté le 03-09-2008 à 23:20:45    

Bonsoir,
 
Excuser moi de vous deranger, mais j'ai besoin de votre aide et conseil pour une question :
- j'ai un systeme de points sur mon site : les membres obtiennent tant et tant de points en postant des presentation de jeu dans un formulaire : si le formulaire est ok on credite x points en plus à l'utilisateur.
--> Le seul hic c'est que si l'utilisateur fait F5 une fois arrivé sur le message de confirmation il obtient le nombre de points qu'il veut.
 
Comment arranger ce problème pour bloquer le rechargement ?
En bloquant au niveau du temps ?
 
 
Merci beaucoup d'avance.

Reply

Marsh Posté le 03-09-2008 à 23:20:45   

Reply

Marsh Posté le 03-09-2008 à 23:30:33    

tu peux, mais tu peux aussi faire une redirection serveur transparente (genre un header) qui rend impossible le renvoi du formulaire ... dans l'immédiat, pas d'autres idées.


---------------
NewsletTux - outil de mailing list en PHP MySQL
Reply

Marsh Posté le 03-09-2008 à 23:34:54    

Je te remercie de ta réponse NewsletTux.
Je ne vois pas trop comment on peut concevoir cela !?
 
Car au debut j'avais pensé faire à la phpBB : c'est à dire bloquer pendant 15 secondes ne pas avoir acces à la page par exemple mais bon ça ne resoud pas vraiment mon probleme.
 
Bonne nuit. :D

Reply

Marsh Posté le 04-09-2008 à 08:24:27    

Le protocole HTTP 1.1 a un header spécialement fait pour cela : 303 See Other.
 
Donc au lieu d'afficher la page confirmation, on fait une redirection vers celle-ci via un 303, genre :

Code :


 
Donc déjà avec un simple F5 y'aura plus de données POST envoyée, il va juste rafraîchir la page de confirmation.
 
Maintenant ça l'empêche pas de faire "Précédent" et de réenvoyer le formulaire, donc faut un autre systus : token à usage unique dans le formulaire, validation par un humain, etc.

Reply

Marsh Posté le 04-09-2008 à 22:27:35    

Merci FlorentG pour ta réponse rapide,
 
Merci pour ce code qui fonctionne a merveille. Mais comme tu le souligne bien, l'utilisateur peut revenir en arriere et faire valider à nouveau.
- il y a la possibilité de l'humain, mais je souhaite que mon systeme soit actif de suite, et que les presentations de jeu n'ont pas besoin d'etre validé (trop de boulot). Seulement si par la suite je m'apercoit qu'il y a des abus, là je peux voir (recuperant le log de tout : id_utilisateur, heure de l'envoi, pour quel id jeu, avec quelle adresse IP).
- Ensuite qu'est ce que le token ? (j'ai du mal a comprendre sur le site de php.net).
 
 
Merci encore

Reply

Marsh Posté le 05-09-2008 à 07:48:13    

Salut !
 
Il te suffit de générer un "jeton" lorsque tu arrives sur ta page du formulaire.
Tu mets ce jeton en session et comme ça si la personne fait F5, le jeton qui sera à nouveau créé ne correspondra pas à celui qui est en session, donc son F5 ne fera rien de plus que rafraichir la page ;-)
 
Bon courage :-)

Reply

Marsh Posté le 06-09-2008 à 11:48:39    

Bonjour à tous,
 
Vraiment du mal à comprendre : actuellement j'ai ma page de confirmation directement dans mon formulaire d'ajout (mais je ne suis pas sûr que ça soit différent ainsi).
 
Je vais voir toujours
 
 
Merci

Reply

Marsh Posté le 07-09-2008 à 01:27:10    

je vais p-ê dire une bêtise, mais si on se base sur l'IP (donnée certes falsifiable), en un rafraichissement de page, on voir que c'est la même IP qui réenvoie ... il est très peu probable (ça dépend quel public on cible) que 2 personnes aient la même IP (sauf derrière un routeur) donc on peut considérer qu'une IP ne doit faire qu'un envoi ...


---------------
NewsletTux - outil de mailing list en PHP MySQL
Reply

Marsh Posté le 07-09-2008 à 11:03:04    

Les sessions n'ont plus car si les cookies sont désactivés on l'a dans l'os.

Reply

Marsh Posté le 07-09-2008 à 11:45:03    

Merci beaucoup pour toute vos propositions.
 
Actuellement je fait comme cela :

Citation :

Si la personne est connecté à son compte
{
  $masquer_formulaire = false;
  Mes requetes d'enregistrements et de verifications des champs.
}
 
if($masquer_formulaire != true)
{
  Mon formulaire avec les champs à remplir.
}


 
 
Donc je vois plus ou moins avec ce que tu me dis Fred82 ; mais je ne vois pas où est la différence avec ce que je fais actuellement.
 
Merci encore enormement pour vos reponses.

Reply

Marsh Posté le 07-09-2008 à 11:45:03   

Reply

Marsh Posté le 07-09-2008 à 11:51:26    

faut stocker dans la base de donnée le fait que l'utllisateur a poster des informations. Ensuite, quand il en insère des nouvelles, faut vérifier qu'il en a pas déja postée aujourd'hui.

Reply

Marsh Posté le 07-09-2008 à 11:57:28    

Oui c'est sûr (j'avais pensé faire suivant la date : par exemple que l'utilisateur doit attendre 30 secondes afin de reposter) ; mais personnellement il faut que j'autorise l'utilisateur a envoyé autant de fois un nouveau formulaire qu'il le veut.
 
Ou alors ; je comprend un peu mieux l'idée de fred82 et dj-julio : je me fabrique une variable composée de 10 chiffres aleatoires par exemple ; si ce chiffre se trouve deja dans la BDD alors il ne peut renvoyer son formulaire (donc faut que j'enregistre pour chacune de mes insertions ce chiffre aleatoire).
--> Qu'en pensez vous ? Pas trop de risque que le nombre à 10 chiffres retombent deux fois ? Pas de problème au niveau du cookie au moins ?
 
 
Merci

Reply

Marsh Posté le 07-09-2008 à 12:04:17    

suffit de generer un GUID...

Reply

Marsh Posté le 07-09-2008 à 14:02:24    

Bon je viens d'essayer en generant une cle longue avec tout les caracteres possibles et chiffres : ça me genere a chaque fois une nouvelle cle sur le meme formulaire : donc je ne peux garder une meme cle tout au long u meme formulaire.
 
La methode me semble pourtant la seule vraiment realisable mais ça ne fonctionne pas comme je fais (c'est à dire generer une cle et afficher la confirmation seulement si la cle generer n'est pas deja enregistrée dans la table).

Reply

Marsh Posté le 07-09-2008 à 18:56:21    

Fred82 merci de m'avoir eclaire sur les sessions (meme si je connaisais deja plus ou moins).
Si la clé est générée a partir du moment que l'utilisateur se connecte a son compte (donc il créer un cookie avec la clé) ; et qu'il utilise la même clé tout au long de sa session ; il ne pourra pas poster 2 fois un formulaire d'ajout de jeu (chose que je veux autoriser).
 
Sinon je peux peut-être changer mon systeme de points.

Reply

Marsh Posté le 08-09-2008 à 18:29:07    

NewsletTux a écrit :

je vais p-ê dire une bêtise, mais si on se base sur l'IP (donnée certes falsifiable), en un rafraichissement de page, on voir que c'est la même IP qui réenvoie ... il est très peu probable (ça dépend quel public on cible) que 2 personnes aient la même IP (sauf derrière un routeur) donc on peut considérer qu'une IP ne doit faire qu'un envoi ...


"sauf derrière un routeur" ce qui veut dire :
- les abonnés AOL vu qu'AOL mets tous ses abonnés (ou au moins les abonnés RTC) derrière un petit nombre de routeur (d'autres FAI font surement pareil dans d'autres pays) pour limiter le nombre d'IP qu'ils sont obligé de réserver pour leurs abonnés
- ceux qui vont sur le net depuis leur boulot (généralement moins d'Ip que d'employés et assez souvent une seule par bâtiment)
- ceux qui habitent dans certains pays (ne pas oublier qu'il n'y a pas si longtemps wikipedia a bannis de ces serveurs un pays entié de l'europe de l'Est en bloquant une seule adresse IP)
 
Finalement, le "très peu probable" devient très vite "très probable" quand un site web prend de l'ampleur.
 
PS : A noter qu'avec AOL en RTC, l'adresse IP connus des serveurs web peut changer d'une demande de page à l'autre. Le serveur web peut donc croire que la demande vient de deux ordinateurs distincts si on se base sur l'adresse IP et ce même si l'utilisateur n'a fait qu'appuyer sur F5.
 
PS2 : Avec certains FAI et certains modem (ADSL, cable, fibre, ...) l'abonné peut demander un changement d'IP autant de fois (et surtout aussi souvent) qu'il en a envie. Un tel abonné qui connait la méthode qui a le bon modem et le bon FAI pourrait poster autant de fois qu'il veut si on se base sur l'adresse IP pour limiter le flood.

Reply

Marsh Posté le 10-01-2009 à 12:11:18    

Une solution (peut-être pas la meilleure)
 
Il te faut  
  - un id unique par session pour ARRIVER dans le fomulaire.
  - un moyen de vérifier la validité de ton id
 
page précédent le form:

Code :
  1. define('my_seed', 'ma_seed_introuvable');
  2. $id_form = rand(10000);
  3. $form_hash = md5(my_seed.$id_form);
  4.  
  5. header('location: form.php?id='.$id_form.'&h='.$form_hash);


form.php

Code :
  1. define('my_seed', 'ma_seed_introuvable'); // le même bien sûr que la page précende. IRL, dans un include séparé
  2.  
  3. $id_form = isset($_REQUEST['id'] : $_REQUEST['id'] : false;
  4. $hash = isset($_REQUEST['h'] : $_REQUEST['h'] : false;
  5.  
  6. if( $hash != md5( my_seed.$id_form ) ) die ('Ho ho ho, petit canaillou !');
  7.  
  8. if( deja_valide($id_form) ) die ('Vous avez déjà participé'); // ou un header location par exemple
  9.  
  10. ?><form action="submit.php">
  11.  <input type="hidden" name="id" value="<?=$id_form?>" />
  12.  <input type="hidden" name="h" value="<?=$hash?>" />


 
submit.php

Code :
  1. define('my_seed', 'ma_seed_introuvable'); // le même bien sûr que la page précende. IRL, dans un include séparé
  2.  
  3. $id_form = isset($_REQUEST['id'] : $_REQUEST['id'] : false;
  4. $hash = isset($_REQUEST['h'] : $_REQUEST['h'] : false;
  5.  
  6. if( $hash != md5( my_seed.$id_form ) ) die ('Ho ho ho, petit canaillou !');
  7.  
  8. if( deja_valide($id_form) ) die ('Vous avez déjà participé'); // ou un header location par exemple
  9. ...


 
Cela implique que l'on a un moyen de vérifier que le formulaire $id_form a déjà été validé ou pas (par exemple en le stockant dans une base).
Cela implique aussi que le client ne puisse pas retourner sur la page précédent le formulaire pour regénérer un couple id/hash valide.
 
Par contre, ca marche meme avec des cookies désactivés et avec des formulaires créés à la main.
 
L'idée, comme tu peux le voir, c'est d'encoder une valeur publique (l'id_form) à l'aide d'une valeur privée (le seed). C'est le principe de base de la cryptographie moderne (cf dans google RSA, clé publique/clé privée, etc.


---------------
http://www.gabouel.com
Reply

Marsh Posté le 10-01-2009 à 12:56:22    


Ce n'est pas çà le problème !
Le problème c'est le cookie (par défaut PHPSESSID) qui identifie le client.

Reply

Marsh Posté le 10-01-2009 à 13:08:15    


Ca ne veut strictement rien dire, les cookies côté serveur ça n'existe pas, les cookies sont toujours sur le client, et luc@s a parfaitement raison: si les cookies sont désactivées les sessions sautent (le client ne stockant pas le sessionid, il ne peut renvoyer celui-ci, le serveur ne peut donc pas retrouver la session et en recrée une à chaque fois), sauf à placer l'ID de session autre part (e.g. la majorité des serveurs d'application java foutent le sessionid dans l'URL quand les cookies ne sont pas dispos)

Message cité 1 fois
Message édité par masklinn le 10-01-2009 à 13:09:24

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 11-01-2009 à 20:02:14    

masklinn a écrit :

(e.g. la majorité des serveurs d'application java foutent le sessionid dans l'URL quand les cookies ne sont pas dispos)

php aussi si c'est autorisé dans le php.ini .

Reply

Marsh Posté le 12-01-2009 à 18:02:07    

oui mais on ne peut pas basculer automatiquement vers l'URL si les cookies sont désactivés. Me trompe-je :??:

Reply

Marsh Posté le 12-01-2009 à 18:30:30    

Si tu règles le php.ini pour que ça soit interdit alors il ne le mettra jamais dans l'URL. Sinon il basculera automatiquement du mode cookie au mode URL sans que tu n'ai à t'en préoccuper.
En fait, à l'ouverture d'une session, si rien n'est transmis par cookie alors le sessionid sera envoyé pour être stocké en cookie tout en étant rajouté à chaque URL présente dans la page.
 
Plus d'info dans la section sur les sessions et dans la page traitant de php.ini (lire les différentes directives correspondant aux sessions. Ca permet de comprendre assez bien ce qu'on peut ou non régler)
 
EDIT : A noter qu'on peut aussi autoriser les id de session par URL sans autoriser leur stockage dans les cookies. Mais côté sécurité, c'est vraiment pas le meilleur réglage.


Message édité par omega2 le 12-01-2009 à 18:31:56
Reply

Marsh Posté le 12-01-2009 à 19:02:04    

ok, c'est bon à savoir

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed