login  Naam:   Wachtwoord: 
Registreer je!
Scripts > PHP > Contact formulieren > Prevent multi submit


Reacties op het script Prevent multi submit

Offline  Thomas
Gepost op: 20 maart 2005 - 14:23
Moderator



Nuttige functie, maar ik weet niet of je je sessie nu in een functie moet starten - meestal wordt 'sessie-management' ergens anders geregeld. Dit (de functie in zijn huidige vorm, met hierin session_start()) zorgt ook voor problemen als je deze functie declareert wanneer je pagina al is begonnen .

Om doubleposts te voorkomen gebruik ik altijd header("Location: somewhereelse.php") nadat ik een formulier heb verwerkt, en dat is een prima alternatief lijkt me ?
Je zou zelfs $_POST of $_GET expliciet leeg kunnen gooien ? (NIET met unset($_POST) maar $_POST = array() ofzo ?)

Als iemand 1 karakter verandert in de invoer is de invoer wel weer compleet "nieuw" omdat de hash dan compleet anders is, dus ik weet niet of dit een goede beveiliging is tegen spammers .

Anyway, food for thought.

Offline  olaf
Gepost op: 21 maart 2005 - 19:35
HTML beginner



@FangorN,
Je hebt gelijk zoals de sessie nu geopend wordt kan het fout gaan. Ik zou misschien iets erbij moeten vermelden. (ik dacht ik zet het erbij voor de gebruikers die verder geen sessie nodig hebben).

Offline  olaf
Gepost op: 26 maart 2005 - 08:42
HTML beginner



... je hebt volgens mij naar mijn antwoord nog enkele opmerkingen toegevoegd.

Ik ben al een tijdje bezig met dit probleem, "header("Location:..." vind ik niet leuk bij sommige formulieren. Ik wil graag de bezoeker op de pagina laten staan. Met deze functie blijft de informatie voor de verzender nog steeds zichtbaar. Ik vind het ook niet fijn als een formulier naar het versturen leeg is, stel dat ik een iets gewijzige informatie nog een keer will versturen (b.v domein regsitratie). Uiterlijk heb ik dit script geschreven voor mijn contact formulieren zonder bang te zijn voor spammers.

Nog bedankt voor je tips.

Offline  Thomas
Gepost op: 14 januari 2015 - 22:11
Moderator



Nu ik dit script weer terug zie, is dit wellicht een betere oplossing om dubbelposting tegen te gaan: http://en.wikipedia.org/wiki/Post/Redirect/Get

Wel moet je dan iets verzinnen om je eerder ingevulde informatie terug te krijgen indien je formulier onvolledig of verkeerd is ingevuld zodat je deze kunt verbeteren voordat je deze opnieuw verstuurt.

EDIT: daarnaast zou je in (publieke) formulieren tevens een CSRF (Cross Site Request Forgery) token (noot: dit token voorkomt dus CSRF ) kunnen stoppen zodat je alleen via die site een formulier kunt versturen.

Kort gezegd werkt dit als volgt:
Op het moment dat je de pagina laadt genereer je een random token, wellicht is het genereren van een hash het makkelijkste. Het doet er niet toe hoe dit precies gebeurt, als deze maar redelijk "random" is. Deze waarde stop je zowel in je sessie alsook in het formulier als een verborgen veld:
  1. <?php
  2. // aanname: sessie is ergens gestart
  3. $randomToken = '...'; // verzin iets om een random token te genereren
  4. $_SESSION['token'] = $randomToken;
  5. // ...
  6. ?><form action="..." method="post">
  7. <input type="hidden" name="token" value="<?php echo $randomToken ?>">
  8. ...
  9. </form>

Vervolgens controleer je na het submitten, als onderdeel van de validatie van je formuliergegevens of het token klopt en tegelijkertijd invalideer je het token meteen zodat deze maar eenmalig gebruikt kan worden:
  1. <?php
  2. // aanname: sessie is ergens gestart
  3.  
  4. // houd ergens bij of er fouten zijn opgetreden, bijvoorbeeld in een array:
  5. $errors = array();
  6. if (
  7. empty($_POST['token']) ||
  8. empty($_SESSION['token']) ||
  9. $_POST['token'] != $_SESSION['token']
  10. ) {
  11. $errors[] = 'invalid form token';
  12. } else {
  13. // token was ok maar zorg ervoor dat deze niet herbruikbaar is
  14. unset($_SESSION['token']);
  15. }
  16. // valideer de rest van je formulier-data
  17. // controleer of er fouten zijn opgetreden en beslis wat er dient te gebeuren
  18. // ...
  19. ?>


Enkel aanvullende informatie, vragen en antwoorden op vragen zijn welkom.
 
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.037s