Reacties op het script Dubbelpost tegen gaan
|
Gepost op: 05 februari 2007 - 11:48 |
|
|
|
PHP expert
|
handig script. Misschien moet je ook iets voor files inbouwen ?(wanneer een formulier mbv javascript is verzonden en het alleen een file veld bevat) |
|
|
|
Gepost op: 05 februari 2007 - 17:08 |
|
|
|
PHP ver gevorderde
|
Goed dat je me hier op wijst . Ik had hem over het hoofd gezien. Deze wordt wel wat moeilijker, omdat je soms hetzelfde bestand ook echt 2 keer ergens upload (dus niet dubbelpost). En kan dat eigenlijk wel? lijkt me bij grote bestanden van niet. Ik zal kijken wat ik kan doen. |
|
|
|
Gepost op: 06 februari 2007 - 20:40 |
|
|
|
PHP expert
|
nouja het bestand heeft een andere naam de tweede keer. maar zolang de post en de file hetzelfde is wordt in principe dezelfde actie ondernomen. anders zou er iets meegegeven moeten zijn van een andere map waar het in moet komen. |
|
|
|
Gepost op: 06 februari 2007 - 22:42 |
|
|
|
PHP ver gevorderde
|
Ik heb het niet getest maar ik denk dat dit wel moet werken voor wat jij wilt bereiken:
<?php
/* PHP code om het tegen te gaan */
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
if(isset($_SESSION['dubbelpost']) && $_SESSION['dubbelpost'] == $_POST)
{
$_SESSION['dubbelpost'] = $_POST;
unset($_POST);
}
else
{
$_SESSION['dubbelpost'] = $_POST;
}
if(isset($_FILES))
{
$bSame = true;
foreach($_FILES as $sKey => $aFile)
{
if($aFile['name'] == $_SESSION['dubbelfiles'][$sKey]['name'] && $aFile['type'] == $_SESSION['dubbelfiles'][$sKey]['type'] && $aFile['size'] == $_SESSION['dubbelfiles'][$sKey]['size'])
{
continue;
}
$bSame = false;
}
if($bSame === true)
{
$_SESSION['dubbelfiles'] = $_FILES;
unset($_FILES);
}
else
{
$_SESSION['dubbelfiles'] = $_FILES;
}
}
}
?>
<?php /* PHP code om het tegen te gaan */ if($_SERVER['REQUEST_METHOD'] == 'POST') { if(isset($_SESSION['dubbelpost']) && $_SESSION['dubbelpost'] == $_POST) { $_SESSION['dubbelpost'] = $_POST; } else { $_SESSION['dubbelpost'] = $_POST; } { $bSame = true; foreach($_FILES as $sKey => $aFile) { if($aFile['name'] == $_SESSION['dubbelfiles'][$sKey]['name'] && $aFile['type'] == $_SESSION['dubbelfiles'][$sKey]['type'] && $aFile['size'] == $_SESSION['dubbelfiles'][$sKey]['size']) { continue; } $bSame = false; } if($bSame === true) { $_SESSION['dubbelfiles'] = $_FILES; } else { $_SESSION['dubbelfiles'] = $_FILES; } } } ?>
|
|
|
|
Gepost op: 07 februari 2007 - 13:03 |
|
|
|
Moderator
|
Hm, ik denk dat je hiermee niet echt iets oplost.
Het is meer een workaround waarin je het gebruik van cookies min of meer verplicht maakt (zonder cookies geen sessies, tenzij je het sessie-id via de URL doorgeeft, wat mij geen strak plan lijkt).
En wat als je formulier-invoer (hebt) verwerkt?
Dan blijf je met die $_POST-vars rondzeulen totdat je opnieuw een form verwerkt?
Verder kom je onwijs in de problemen als mensen op de "Terug"-knop gaan drukken. In combinatie met sessies levert dit al vlug "Deze pagina is verlopen"-fouten op, en daarbij komt nog het gezeur van je browser "Wil je dit formulier opnieuw versturen?". Met name dit laatste lijkt mij onwenselijk en juist hetgene wat je wilt voorkomen.
Als je dit soort dubbelposts wilt tegengaan (die "per ongeluk" plaatsvinden), dan zorg je gewoon dat de pagina wordt ververst met een header op het moment dat je het formulier hebt verwerkt. $_POST wordt dan namelijk geleegd, en de method is niet langer "POST".
Ook vraag ik mij af of deze gelijkheids-check:
SESSION['dubbelpost'] == $_POST
SESSION['dubbelpost'] == $_POST
goed gaat - hier vergelijk je namelijk twee arrays...
Wanneer je dubbelposts nog wat beter wilt tegengaan dan enkel een header-controle, dan zijn er wel elegantere oplossingen te verzinnen, waarbij je niet heel de tijd met $_POST hoeft rond te zeulen.
Bijvoorbeeld:
Maak een random string bij aanroep van de form-pagina, en sla deze op in je sessie en geef deze mee in een hidden veld.
Bij het verwerken van het formulier controleer je of deze twee zaken hetzelfde zijn, en zoja verwerk je het formulier EN reset je de random string in je sessie zodat deze niet hergebruikt kan worden (dubbelpost). |
|
|
|
Gepost op: 07 februari 2007 - 16:07 |
|
|
|
PHP ver gevorderde
|
Citaat: Hm, ik denk dat je hiermee niet echt iets oplost.
Je lost er wel wat mee op , MAAR het kan beter .
Citaat: Ook vraag ik mij af of deze gelijkheids-check:
Ik weet bijna zeker dat dit wel gaat, want ik heb dit script zelf uitgetest en het werkte na behoren.
Citaat: Maak een random string bij aanroep van de form-pagina, en sla deze op in je sessie en geef deze mee in een hidden veld.
Goed idee, ik zal binnenkort kijken of ik een andere methode dan die ik nu gebruik die makkelijk in gebruik is kan maken, ben op dit moment druk bezig met een wysiwyg-editor. |
|
|
Enkel aanvullende informatie, vragen en antwoorden op vragen zijn welkom. |
|
|
|