Frage

Was ist der beste Weg, um eine Form zu verhindern, wiederaufbereitet wird, wenn ein Benutzer eine Zurück-Taste trifft?

Ich folge der Pfosten- / Redirect / Get Muster , so ich habe kein Problem, wenn F5 gedrückt wird, aber die zurück-Taste bietet nach wie vor die Möglichkeit, die Form erneut einzureichen. Wenn diese Form eine Kreditkarten-Seite ist, das ist schlecht.

Diese Frage wurde etwas gefragt hier , aber die Phrasierung und Antworten waren von schlechter Qualität und nicht spezifisch für dieses Problem genau.

Ich habe form.php, die an sich trägt. Wenn es keine Fehler in Eingangsdaten bei Vorlage waren, wird der Benutzer form_thanks.php umgeleitet. Schlagen zurück (und auf „Senden“ oder „erneut senden“) einmal erneut sendet form.php (BAD!) Und bringt sie dann form_thanks.php zurück.

Bitte geben Sie auch Lösungen, die nicht mit Sessions verwenden, wenn möglich.

War es hilfreich?

Lösung 2

Dies sollte mit einem Einweg-Token erfolgen oder eine nonce . Der php / Server sollte dieses Token in einem versteckten Formularfeld umfasst.

Es sollte eine Liste aller bisherigen Token speichern und jedes Mal, wenn ein Formular abgeschickt wird, sollte es überprüfen, um zu sehen, ob das Token in der Liste der zuletzt gültigen Tokens ist.

Wenn es nicht in der Liste, dann tut nachbearbeiten nicht die Form.
Wenn es in der Liste enthalten ist, dann das Formular verarbeiten und das Token aus der Liste entfernen.

Die Token können in Sitzungen oder nur eine einfache Datenbanktabelle ohne Sitzungen behandelt werden. Die Token sollte jedoch benutzerspezifisch sein.

Dies ist auch der empfohlene Weg CSRF Angriffe zu vermeiden.

Andere Tipps

Ich würde es eine andere Art und Weise tun. Setzen Sie einen versteckten Eingang mit einem zufälligen Zeichenfolge als Wert nach oben, und wenn es vorgelegt Speichern, die zufällige Zeichenfolge in einer Sitzung. Stellen Sie eine einfache Prüfung zu sehen, ob sie es bereits gebucht haben, und wenn sie nicht über die Eingabe akzeptieren.

Gerade laut hier denken heraus. Aber was ist eine Variation auf Post / Redirect /, wo die endgültige get nicht wirklich der letzte get ist;) Aber besser gesagt, es wiederum immer automatisch nach vorn auf die wirklich letzte Seite, so dass sollte der Benutzer drücken Sie die Zurück-Taste, kehren sie rechts zurück, woher sie gekommen sind?

EDIT:

Ok, unter Berücksichtigung Kommentar des OP, hier ist eine andere Idee. Die URL für die Formulareinreichung könnte, einen Parameter erfordern, die nur für eine Verwendung gut ist. Das Token würde erzeugt werden (unter Verwendung von MD5 oder so), bevor das Formular abgeschickt wurde und konnte in einer Datenbank gespeichert werden (als Reaktion auf jemand anderen Vorschlag gebeten Sie eine Lösung ohne Sitzungen verwendet wird). Nachdem das Formular verarbeitet wird, würde dieses Token dann als bereits verwendet worden, in der Datenbank gekennzeichnet werden. So dass, wenn die Seite mit dem gleichen Grund zurückgeführt wird, können die Schritte der Wiedervorlage der Formulardaten an das Backend zu verhindern genommen werden.

Späte Antwort, aber man kann mit Hilfe einer AJAX-basierte Lösung, die die Verarbeitung ganz vermeiden; es würde eine Nonce mit diesem Verarbeitungsschema kein Problem mit, einschließlich, aber durch eine asynchrone Abfrage, die auf Erfolg, den Benutzer umleitet, werden die Anfragen nicht durch erfrischende wiederholt, Pressen zurück, oder etwas anderes als die Schaltfläche klicken.

Es ist auch einfach, einen Mechanismus zu implementieren, die von der Taste verhindert entweder zweimal gedrückt wird oder in die Handler durch die Einbettung für die Anforderung während der Anforderung passiert ist „eingesperrt“, wenn etwas wird (ob hohe Niveau mit PrototypeJS oder jQuery oder niedrig Ebene mit handrolliert Funktion) die Mechanismen aktivieren und die Taste zu deaktivieren, wenn die Anforderung Feuer abgeschlossen ist und erste, respectively.

Ich finde, dass wieder die Form in den Zustand bringen, es war, bevor die Seite umgeleitet wurde, wenn das der Fall ist, hat eine versteckte Eingabe / Variable oder etwas, das mit dem Wert beginnt wahr sagen, dann, sobald das Formular abgeschickt wird, und wenn der Wert wahr ist, es auf false ändern und dann einreichen, sonst return false

Versuchen Sie folgendes:

<SCRIPT type="text/javascript">
    window.history.forward();
</SCRIPT>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top