Formulare und Zurück-Schaltfläche des Browsers

Alles, was PHP betrifft, kann hier besprochen werden.

Formulare und Zurück-Schaltfläche des Browsers

Postby startist » 14. September 2008 10:13

Hallo,

ich feile gerade an den letzten Details meiner PHP-Anwendung und möchte folgendes Problem lösen:

Wenn ein Formular gesendet wurde und der Nutzer benutzt den Back-Button des Browsers, wird das Formular noch einmal gesendet. Das soll aber natürlich nicht sein. Welche Möglichkeiten habe ich, das zu unterbinden? Ich habe mir zunächst überlegt, dass ich dies über SESSION-Variablen handlen könnte, aber da ist der Aufwand doch ziemlich hoch. Gibt es vielleicht eine Möglichkeit abzufragen, ob der Back-Button des Browsers getätigt wurde? :P

startist
User avatar
startist
 
Posts: 55
Joined: 24. June 2008 14:10
Location: Dresden

Postby Nobbie » 14. September 2008 12:29

>Wenn ein Formular gesendet wurde und der Nutzer benutzt den Back-Button des Browsers, wird das Formular noch einmal gesendet.

Nein, das stimmt nicht. Wenn nach dem Senden eines Formulars der Back-Button gedrückt wird, erscheint einfach das Formular wieder.

Allenfalls stimmt dieses:

Wenn ein Formular mit Action="POST" gesendet wurde und die Folgeseite einen Link enthält und jemand auf diesen Link geklickt hat und dann auf der nächsten Seite den Back-Button drückt, dann wird ggf. das Formular neu gesendet, weil die Seite von "vor dem Link" das Resultat eines POST-Requests war und die POST-Daten ggf. neu geladen werden sollen (InternetExplorer fragt beispielsweise konkret).

Man kann dieses Verhalten grundsätzlich nicht ändern, die einzige wirkungsvolle Umgehungslösung wäre das Anpassen der Action von "POST" auf "GET", allerdings ist zu beachten, dass ggf. das PHP-Script angepasst werden muss und dass außerdem die maximale Anzahl Zeichen, die ein GET-Request übermitteln kann, durch die maximale Länge der URL im Browser beschränkt ist, die liegt ca. bei 1kb (1 KiloByte). Bei simplen Suchen (Eingabe von wenigen Zeichen) wäre das beispielsweise kein Problem, eine Eingabe eines längeren Textes (wie in Foren beispielsweise) würde sicherlich scheitern.
Nobbie
 
Posts: 13183
Joined: 09. March 2008 13:04

Postby Xardas der Dunkle » 14. September 2008 13:18

Im Grunde war das mit der Session nicht die falsche Idee.
Beim erzeugen des Formulars musst du in der Session eine Variable mit einer eindeutigen ID füllen:
Code: Select all
$_SESSION['secureID'] = md5(uniqid(microtime(), true));

Diesen Wert musst du zusätzlich in einem Hidden-Feld ausgeben.
Wird das Formular nun abgeschickt musst du dort abfragen ob der Wert vom Hiddenfeld und der aus der Session übereinstimmen (dann war der Versand erfolgreich!).
Nun musst du den Wert in der Session natürlich zurücksetzen, sonst währe beim Drücken von F5 (Aktualisieren) oder des Zurückbuttons das versenden wieder erfolgreich.
Stimmt der Wert, aber nicht überein musst du halt ne Fehlermeldung ausgeben das man das Formular nur einmal abschicken darf oder sowas ähnliches ...

mfG
User avatar
Xardas der Dunkle
 
Posts: 482
Joined: 09. March 2008 19:40
Location: /var/www


Return to PHP

Who is online

Users browsing this forum: No registered users and 14 guests