Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

empecher la reactualisation

8 réponses
Avatar
J-F Portala
Bonjour,
je suis confronte au probleme suivant.

Lorsque je valide un formulaire, j'insere un element dans un base de données
et j'affiche une page.

Si je reactualise la page avec les commandes du navigateur, l'ensemble de la
requete est à nouveau envoyé.

Cela ne me parait pas illogique, mais je voulais savoir si on pouvait se
prémunir de cela et par quelle technique.

Merci de vos avis.
Jeff

8 réponses

Avatar
Marc
J-F Portala wrote:
Cela ne me parait pas illogique, mais je voulais savoir si on pouvait se
prémunir de cela et par quelle technique.



il suffit de tester le resultat du formulaire et si la reponse est positive,
faire une redirection : header('Location ...');

Avatar
Olivier Miakinen

Lorsque je valide un formulaire, j'insere un element dans un base de données
et j'affiche une page.


Ok.

Si je reactualise la page avec les commandes du navigateur, l'ensemble de la
requete est à nouveau envoyé.


Normal.

Cela ne me parait pas illogique, mais je voulais savoir si on pouvait se
prémunir de cela et par quelle technique.


La discussion revient assez régulièrement sur le sujet. Comme tu ne peux
pas empêcher un utilisateur (malicieux ou non) de t'envoyer 15 fois la
même requête (resp. 1 000 fois pour l'utilisateur malicieux), le seul
moyen de t'en protéger consiste à bien choisir la clé unique dans ta
base de données, clé unique qui fera que les 999 nouvelles requêtes ne
modifieront pas ta base de données.

--
Olivier Miakinen
Troll du plus sage chez les conviviaux : le nouveau venu, avec
son clan, s'infiltre dans les groupes de nouvelles. (3 c.)

Avatar
bruno at modulix
J-F Portala wrote:
(snip)
Lorsque je valide un formulaire, j'insere un element dans un base de données
et j'affiche une page.

Si je reactualise la page avec les commandes du navigateur, l'ensemble de la
requete est à nouveau envoyé.


Normal.

Cela ne me parait pas illogique, mais je voulais savoir si on pouvait se
prémunir de cela et par quelle technique.


N'en déplaise à John, ma solution (enfin, celle que j'utilise, ce n'est
pas moi qui l'ait inventée !-)) est d'utiliser un redirect si le
traitement du POST est ok. C'est probablement la solution la plus simple
à mettre en oeuvre, et celle qui respecte le plus le protocole HTTP (cf
http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html).


--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"

Avatar
ftc
Bonjour,
je suis confronte au probleme suivant.

Lorsque je valide un formulaire, j'insere un element dans un base de données
et j'affiche une page.

Si je reactualise la page avec les commandes du navigateur, l'ensemble de la
requete est à nouveau envoyé.

Cela ne me parait pas illogique, mais je voulais savoir si on pouvait se
prémunir de cela et par quelle technique.



C'est un problème auquel tout dev PHP se trouve confronté à un moment ou
un autre.

Une solution possible est de généré un token ( identifiant unique ) dans
la page appelante et tu stocke ce token en session et tu le met dans
le formulaire de la page appelante.

Sur la page de traitement, tu vérifies que le token est présent dans les
champs fournis,si oui tu fais tes traitement et tu supprime le token de
la session. Si l'utilisateur rafraîchit a page, le token ne sera plus en
session, tu n'effectues pas les traitements.

Avatar
clifden

Si je reactualise la page avec les commandes du navigateur, l'ensemble de la
requete est à nouveau envoyé.

Cela ne me parait pas illogique, mais je voulais savoir si on pouvait se
prémunir de cela et par quelle technique.



Pour ma part, j'utilise une technique un peu lourde, mais qui est sure
de marcher à tout les coup (au contraire de l'utilisation de HTTP_REFERER)

J'ai conçu la classe suivante:
http://www.phpclasses.org/browse/package/2928.html

Son principe: cree un hash aleatoire, avec un critère adossé:
* nombre d'utilisation max
* moment limite de validité

Ensuite, la fonction de verif, ou brule une utilisation ou verifie que
le moment n'est pas dépassé.

Elle utilise une table mysql

Dans ton cas, tu créé un hash avec un nombre d'utilisation max=1, tu le
met en champ hidden de ton formulaire.
Quand tu reçoit les données, tu verifie le hash avec la methode, et
celle ci te dira si c'est la première et unique fois que tu l'utilise,
sinon, tu peut le savoir et gerer l'erreur. Un internaute qui post
plusieurs fois sera averti et de ton coté tu ne fera pas plusieurs insert.

Avatar
Olivier Miakinen

[...] le seul moyen de t'en protéger consiste à bien choisir la
clé unique [...]


La collision de deux idées que j'avais en répondant a résulté en une
réponse fausse. Désolé.

En réalité, il fallait lire :
1) Le seul moyen de t'en protéger consiste à contrôler l'unicité sur
le serveur (aucun moyen basé sur le comportement du client n'est
efficace, en particulier pas le header('Location:...')).
2) Pour contrôler l'unicité, un moyen (parmi d'autres) est une clé
unique dans la base de données.

--
Olivier Miakinen
Troll du plus sage chez les conviviaux : le nouveau venu, avec
son clan, s'infiltre dans les groupes de nouvelles. (3 c.)

Avatar
Patrick Mevzek
N'en déplaise à John, ma solution (enfin, celle que j'utilise, ce n'est
pas moi qui l'ait inventée !-)) est d'utiliser un redirect si le
traitement du POST est ok. C'est probablement la solution la plus simple
à mettre en oeuvre, et celle qui respecte le plus le protocole HTTP (cf
http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html).


Ah ? Vous pouvez nous citer les «autres» qui respectent «moins» (selon
vous) le protocole HTTP ?

--
Patrick Mevzek . . . . . . Dot and Co (Paris, France)
<http://www.dotandco.net/> <http://www.dotandco.com/>
Dépêches sur le nommage <news://news.dotandco.net/dotandco.info.news>

Avatar
J-F Portala
Merci à tous de vos reponses.

Je m'en vais tester cela tout de suite.
Jeff