PHP Seite "ablaufen" lassen

raven16

Lieutenant
Registriert
Nov. 2008
Beiträge
580
Hi,

wollte mal fragen, ob es ne gute Möglichkeit gibt ohne $_SESSION die Seite ablaufen zu lassen.

Zu meinem Problem:

Ich habe ein Formular in formular.php und trage in formular.php den Datensatz nach dem Abschicken des Formulars in die Datenbank ein und leite danach zu refresh.frm.php weiter und von refresh.frm.php leite ich wieder zurück zu formular.php und sage dort, dass der Datensatz erfolgreich eingetragen wurde. Damit verhindere ich den Seitenrefresh mit F5.

Ich möchte nun verhindern, dass man mit der Maus im Browser zurück klicken kann, um das Formular mit den gleichen Inhalten erneut abzuschicken.

Ich könnte auch einfach prüfen, ob der Datensatz in der DB schon exisiert, nur das gestaltet sich relativ rechenaufwendig, wenn ich nach Volltext suchen lasse. Falls irgendwann mehrere tausend Einträge in der Tabelle exisieren, würde das bestimmt sehr lange dauern.

Hab auch versucht, mit einem hidden-Feld eine 20 Stellige zufällige Zahl zu übergeben, die ich mit in die DB eintrage und dann check ich vor dem Eintragen des Datensatzes, ob die Zahl schon exisiert. Aber das hat irgendwie nicht funktioniert, daher hab ich jetzt wieder zurück gerudert auf anfang.

Danach hatte ich den Einfall, die Seiten irgendwie auf Gültigkeit zu prüfen, sodass man einfach wieder zum leeren Formular weitergeleitet wird, wenn man versucht zurück zu gehen. Falls das überhaupt geht.

Irgendwelche Ideen? :)
 
Vielleicht hilft dir das HTML-Attribut "auto-complete"? Ansonsten könntest du auch per JavaScript die input-Felder löschen.
 
Du kannst nicht verhindern, was der Nutzer unbedingt will.
Aber: Wenn du per POST die Daten abschickst, dann kommt eine tolle Warnmeldung, wodurch die meisten Nutzer nicht nochmal drücken dürften.

Sonst war dein Ansatz mit einer eindeutigen Formularnummer schon gut.
Code:
//query('Create table pending_forms(ID INTEGER PRIMARY KEY AUTOINCREMENT)');//Bei Bedarf auch mit Ablaufdatum
query('insert into pending_forms values()');
echo '<Input type="hidden" Name="fid" value="'.last_insert_id().'">';
...
if(null!==query('select ID from pending_forms where ID=$fid')->fetch()){
query('delete from where id=$fid);//Hier dann z.B. auch die abgelaufenen löschen
...
}
 
1. Mal, beim Aufruf der Seite eine versteckte GUID übergeben (mit diesem Datentyp kann auch dein MySQL umgehen!).
Diese kannst du auch in eine extra Tabelle legen, in der die Einträge nach x Stunden gelöscht werden.

Ich weiss nicht wie man das umsetzt, denke aber du musst es im Header senden: Bei vielen Seiten kommt ein "Inhalt abgelaufen", wenn man auf zurück klickt.

​Gruß.
 
Danke für die Ideen :)
davidbaumann schrieb:
1. Mal, beim Aufruf der Seite eine versteckte GUID übergeben (mit diesem Datentyp kann auch dein MySQL umgehen!).
Diese kannst du auch in eine extra Tabelle legen, in der die Einträge nach x Stunden gelöscht werden.
Dann bräuchte ich aber Cronjobs, die das löschen nach x Stunden übernehmen. Versteh aber dann noch nicht, wie ich dass dann ablaufen lassen kann?

Habe aber vorhin auch noch eine andere Idee gehabt. Ich könnte vielleicht doch noch $_SESSION dafür verwenden.
Ich brauch ja SESSION noch für den Login auf der Seite, aber im Prinzip könnte ich die SESSION auf jeder Seite aufbauen/aufrecht erhalten und für andere Zwecke missbrauchen.
Beim Abschicken des Formulars speicher ich über das hidden-Feld einen zufälligen Wert in einer SESSION-Variable ab. Klickt der User zurück und sendet den gleichen Formularinhalt erneut ab, dann vergleiche ich das hidden-Feld mit der SESSION-Variable und blockiere das erneute Eintragen in die DB, wenn die Werte übereinstimmen

Dann stellt sich die Frage, wie soll ich denn noch den Login realisieren? Hmmm da denke ich ist das ganz einfach zu lösen. Ich setze einfach eine SESSION-boolean-Variable beim Login auf true, und wenn ich Inhalte habe, die nur mit gültigen Login angezeigt werden sollen, dann frage ich ab, ob der Wert der SESSION-Variable auf true gesetzt ist.

Ist vielleicht nicht die beste Variante aber ich glaube das könnte vielleicht klappen.
Habt ihr vielleicht noch sicherheitstechnische oder performancetechnische Einwände oder konstruktive Kritik für meinen Einfall?
Habe ich irgendwas dabei nicht bedacht?

lg
 
Zuletzt bearbeitet:
Wegen der GUID: Vor dem eintragen der Daten in die Datenbank überprüfst du, ob es die GUID schon gibt.
Wenn ja, Abbruch. Wenn nein: Daten eintragen und die GUID.

Geht der Benutzer einfach eine Seite zurück, wird 2x die selbe Guid übertragen, und er kann sich nicht 2x damit registieren.
Eventuell wäre aber auch ein CAPTCHA eine gute Lösung für dich?

​Gruß.
 
raven16 schrieb:
Dann bräuchte ich aber Cronjobs, die das löschen nach x Stunden übernehmen. Versteh aber dann noch nicht, wie ich dass dann ablaufen lassen kann?
lg


Stehe vielleicht gerade auf dem Schlauch, aber warum denn? Du speicherst den Key und ein Datum. Wenn das Formular abgeschickt wurde, führst du eine Fallunterscheidung durch. Falls es den Key nicht gibt, verwirfst du die Anfrage, falls es ihn gibt und Datum > Key-Datum + Zeitschranke, dann rein damit, sonst ebenfalls verwerfen. In beiden fällen wird der Schlüssel gelöscht. Dein Cronjob bräuchtest du höchstens dann, wenn du alle paar Wochen mal die Keys entfernen möchtest, die nie verwendet wurden, um die Tabelle schlank zu halten.
 
Zuletzt bearbeitet:
Dann doch lieber n Cron oder Pseudo-Cron. Wenn man auf dem Server keine vollwertigen Cronjobs laufen lassen kann, dann schreibt man sich ein PHP-basiertes Cron-System, das man dann entweder von cronjobs.de triggern lässt oder aber auf der Startseite per AJAX nebenher mit aufruft.
 
Zurück
Oben