Gå til innhold

Motvirke dobbelposting ved refresh av siden


Anbefalte innlegg

Skrevet

Hvordan kan jeg motvirke at POST variable blir kjørt gjennom systemet en gang til når man refresher siden?

 

Som her for eks, hvordan er det gjort for at denne posten ikke blir lagret i forumdatabasen en gang ekstra om jeg trykker på F5 rett etter å ha postet den?

Videoannonse
Annonse
Skrevet

mest vanlig er vel å kjøre en refresh/redirect slik at nettleseren ikke sender inn POST-data på nytt hvis noen trykker refresh i nettleseren. Utover det må man begynne å loggføre når ting ble utført sist og sjekke om brukeren allerede har gjort noe de x siste sekundene (eller hva det nå måtte være).

Skrevet

Det enkleste er, som Ernie sa, å bruke redirect. Når noen poster noe, så kan du legge inn en redirect fra siden som legger inn posten i databasen til siden som viser posten. Du kan bruke følgende kode for å legge til en redirect:

 

header('303 See Other HTTP/1.1');
header('Location: http://din.internett.si.de/noe/');
// Dette vil også fungere:
header('Location: ../enfil.php');

Skrevet (endret)

Det er og mulig å bruke en token i skjemaet om bare vil virke en gang, andre gang brukere sender inn skjemaet med samme token så skjer det ingen ting. Dette vil også motvirke CSRF.

 

Eks:

if(count($_POST) > 2)
{
    if(strcmp($_POST['token'], $_SESSION['token']) != 0) 
    {
        // Feilmelding, evnt bare vist skjemaet på nytt
    }
     // Pass på at token'en bare fungere en gang
     unset($_SESSION['token']);
}
?>
<form>
.....
<?php
$token = md5(microtime());
$_SESSION['token'] = $token;
?>
<input type="hidden" name="token" value="<?php echo $token ?>">
....
</form>

Endret av Runar0
Skrevet

Hvorfor ikke utføre en sjekk som sjekker om det siste innlegget er identisk med det som brukeren prøver å poste? Så kan du legge til en tidssjekk (feks. 10min) altså at dobbeltposting blir lov etter 10min, feks.

Skrevet

Er ikke dette den beste måten?

 

orginalside.php:

<form action="en_annen_side.php"> ...

 

en_annen_side.php:

//siste linje i scriptet:
header('Location: originalside.php');

 

 

Er vel dette de andre i tråden også sier :p

Skrevet

tull, om man har litt orden i sakene trengs ikke ob_start/flush. Siden som tar imot post-data skal ikke sende noe til browseren, den skal kun ta imot og behandle post-skjemaet før browser blir videresendt til neste side.

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...