2009-12-01 13 views
0

Je suis novice en PHP et pour apprendre la langue et les concepts je travaille sur un site e-commerce avec un panier, etc. Dans ce site j'ai des articles, quand un article est cliqué, l'identifiant de l'article est envoyé via la méthode GET à la page du panier. En utilisant cet identifiant, j'ajoute l'article au panier (tableau en db) et ça marche bien.désactiver l'appel répété en utilisant getmethod() en php lorsque la page est rafraîchie

<a href="do_shoppingcart.php?id=<?php echo "$itm_id"; ?>"> 

Le problème est; Si l'utilisateur clique sur le bouton d'actualisation, l'élément est à nouveau ajouté au panier. Pensez-vous que désactiver le bouton d'actualisation ou le bouton F5 est une bonne option? que dois-je faire pour empêcher l'utilisateur d'ajouter l'article au panier lorsque la page est actualisée? Dans les formulaires, j'ai remarqué que "(isset ($ _ POST ['Submit'])) {}" est utile, mais pour la méthode GET, cela ne fonctionne pas en conséquence.

Votre aide est appréciée.

+0

ce que votre panier ressembler à la table? – Galen

Répondre

-1

vous devez effectuer des actions destructives avec POST, réserver GET pour les opérations idempotentes.

+0

Cela ne serait pas nécessairement utile. L'utilisateur peut toujours actualiser la page et accepter de renvoyer les données ... – Franz

+0

bien le navigateur vous avertit que vous allez répéter la dernière action. il ne le fait pas pour les GET, parce que ceux * devraient * être non destructifs. –

+0

Eh bien, il y a assez de gens qui pourraient mal le comprendre. Il suffit de regarder toutes les personnes moins intéressées par la technologie que vous pourriez connaître et qui cliqueront simplement sur "OK". – Franz

0

La façon la plus sûre (également utile pour prévenir les attaques CSRF) est d'ajouter un jeton de champ caché à votre formulaire. Ensuite, dans le script de traitement, seulement ajouter l'élément à la base de données si ce jeton n'existe pas encore ...

Le jeton peut être créé par quelque chose comme ceci:

$token = sha1(uniqid()); 

à votre lien Annexé: Ensuite, lors du traitement, vous interrogez votre base de données pour une ligne avec ce jeton.

SELECT 1 FROM table WHERE token='abc....' 

Si cette requête renvoie un résultat, ne traite rien d'autre ...

+0

j'aider que simplement ajouter le jeton ne va pas aider à prévenir les attaques CSRF. Un peu plus devrait être fait, mais c'est un autre sujet à nouveau ... – Franz

+0

@ Franz-je n'utilise pas un formulaire dans la page shoppingcart, où j'utilise l'ID envoyé via la méthode GET. C'est juste un script simple. – pier

+0

C'est bien aussi. Ajoutez simplement un jeton à l'URL alors. – Franz