Formular-Reloads verhindern

Um beim Formular Reload doppelte Datensätze zu verhindern, sollte man einen Reload-Check einbauen. Wie funktioniert dies auf einfache Art und Weise? Indem Sie mit einem so genannten Token arbeiten.

Formulare gehören zum täglichen Brot eines jeden PHP Entwicklers. Sie lesen Daten aus, stellen diese in einem Formular dar und ändern Datensätze oder tragen Datensätze neu ein.

Ein Problem, vor dem man oft steht, ist, dass der Nutzer einen Reload des Formular-Submits auslösen kann und dann Datensätze doppelt (mit jeweils anderer ID) eingetragen werden. Die Browser versuchen uns zwar davor zu schützen, indem beim Reload eines POST-Formulars eine Sicherheitsabfrage erfolgt, ob man die Formulardaten erneut senden möchte, unbedarfte Nutzer fühlen sich aber schnell überfordert und klicken gerne auf „Wiederholen“, um die Daten erneut an den Server zu schicken.

Um dies zu verhindern, sollte man einen Reload-Check einbauen. Wie funktioniert dies auf einfache Art und Weise? Indem Sie mit einem so genannten Token arbeiten. Das ist eine eindeutige Zeichenkette, die jedes Mal beim Anzeigen des Formulars generiert und nach dem Submit in der Session gespeichert wird. Sendet der Nutzer das Formular erneut, wird auch dieser Token erneut mit geschickt. Hier überprüft man nun, ob dieser mitgelieferte Token bereits in der Session existiert. Falls ja, wird das Speichern verweigert und dem Nutzer eine Meldung gegeben, falls nein, wissen Sie, dass die Daten gespeichert werden und der Token in der Session abgespeichert werden können.

Zur Generierung des Tokens bedienen wir uns der bekannten md5 und uniqid Funktionen, um einen eindeutigen, auf 32 Zeichen begrenzten String zu generieren.


Dieser Token wird – der Einfachheit halber – in ein verstecktes Formular-Element eingetragen und beim Submit mitgeliefert. Eine Hilfsfunktion überprüft, ob dieser Token in der Session in einem Array existiert und liefert ein TRUE oder FALSE zurück. Gleichzeitig schreibt man sich noch eine Hilfsfunktion, die direkt das hidden Formular-Element als HTML Code zurückliefert. Verpackt man die Funktionalität in eine Klasse, sieht das folgendermaßen aus:


Das dazugehörige Programm sähe so aus:


Wenn Sie das Formular abschicken, kommt die Meldung „Ok, Daten können gespeichert werden“. Machen Sie dann einen Reload (im Internet Explorer über Strg+R oder die F5-Taste) und beantworten die Browser-Frage mit „Wiederholen“, dann kommt die Meldung „Sie haben einen Reload gemacht“.

Damit haben Sie eine sehr einfache Möglichkeit, auf Formular-Reloads zu reagieren.



Björn Schotte ist Web Application Developer und Consultant. Neben seiner Erfahrung in vielen Webprojekten/Schulungen, u.a. für Lycos Europe, Cap Gemini Ernst & Young, Karlsruher Versicherungen, 100world.com AG, 21st Media, betreibt er auch noch einige nicht-kommerzielle Projekte wie zum Beispiel das PHP-Center www.php-center.de/.


Copyright
Alle Rechte an diesem Artikel sind Björn Schotte vorbehalten. Nachdruck und Vervielfältigung der redaktionellen Texte einschließlich Speicherung und Nutzung auf optischen und elektronischen Datenträgern nur mit Zustimmung von Björn Schotte und ZDNet.

Themenseiten: Anwendungsentwicklung, Software

Fanden Sie diesen Artikel nützlich?
Content Loading ...
Whitepaper

Artikel empfehlen:

Neueste Kommentare 

1 Kommentar zu Formular-Reloads verhindern

Kommentar hinzufügen
  • Am 20. August 2016 um 17:12 von Peter Udem

    Guter Artikel.

    Ich habe allerdings einen anderen Weg (wie ich finde: leichteren) Weg gefunden: Und zwar direkt in der Datenbank gucken, ob alle Bedingungen des Doppeleintrages erfüllt sind. Die SQL-Abfrage sieht dann im Prinzip so aus:

    SELECT count(id) AS anz FROM `tabelle` WHERE (spalte1=Ergebnis von GET bzw. POST für spalte1) AND (spalte2=Ergebnis von GET bzw. POST für spalte2) usw.

    Natürlich muss man für sich entscheiden, welche Spalteinträge alle bereits vorhanden sein müssen, ob die Bedingungen des Doppeleintrages zu erfüllen. Eintrag in Datenbank nur dann vornehmen, wenn anz == 0 ist

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *