Wie verhindern Sie einen Benutzer von Daten veröffentlichen mehrere Male auf einer Website

StackOverflow https://stackoverflow.com/questions/130337

  •  02-07-2019
  •  | 
  •  

Frage

Ich arbeite an einer Web-Anwendung (J2EE), und ich möchte die Optionen kennen, die für den Umgang mit einem Doppel-Post aus dem Browser zur Verfügung stehen.

Die Lösungen, die ich in der Vergangenheit gesehen und verwendet werden, sind alle Client-Seite:

  • Deaktivieren Sie die Senden-Schaltfläche, sobald der Benutzer darauf klickt.
  • Folgen Sie ein POST-Redirect-GET-Mustern POSTs zu verhindern, wenn der Benutzer die Zurück-Schaltfläche klickt.
  • Gehen Sie mit dem onSubmit-Ereignis des Formulars und den Überblick über die Einreichung Status mit JavaScript.

Ich würde es vorziehen, eine serverseitige Lösung, wenn möglich umzusetzen. Gibt es bessere Ansätze als die, die ich oben erwähnt habe, oder sind clientseitige Lösungen am besten?

War es hilfreich?

Lösung

Es ist schwer, eine idiotensichere Lösung zu implementieren (wie sie alle Tage die Idioten verbessern). Egal, was Sie tun, kann die Client-Seite falsch manipuliert oder führen werden.

Ihre Lösung bekam Server-Seite zu sein, zuverlässig und sicher zu sein. Das heißt, ein Ansatz ist, die Anfrage und prüfen System / Datenbankstatus oder Protokolle zu bestimmen, ob es bereits verarbeitet zu überprüfen. Im Idealfall sollte der Prozess auf der Serverseite idempotent, wenn möglich , und es wird schützen müssen gegen Betrogene macht geltend, wenn es nicht sein kann.

Andere Tipps

Sie können ein „Ticket“ als Teil der Form, einige Zufallszahl liefern - und sicherstellen, dass es nicht zweimal akzeptiert erhält, auf der Serverseite

.

Zwei serverseitige Lösungen in den Sinn kommen:

  1. Erstellen Sie den einmaligen Gebrauch „Token“ in einem versteckten Formularfeld. Sobald ein Token verwendet wird, wird es gelöscht egal aus welcher Datenbank oder Sitzungskontext Objekt, das Sie speichern es in. Das zweite Mal, es ist nicht akzeptiert.
  2. Cache Informationen erhalten, und wenn eine identische Form innerhalb einer bestimmten Zeitperiode empfangen wird (10 Minuten? Eine Stunde? Sie entscheiden!) Wird sie ignoriert.

Implementieren eines uniqueid mit der Bitte gehen und es melden Sie sich zusammen mit der Ausführung. Wenn die ID wurde bereits angemeldet, tun Sie nicht den Auftrag erneut. Dies ist ein bisschen wie die Rückfalllösung - sollten Sie auf den Button oder Link Clientside auch versuchen, und deaktivieren Sie, wie Sie selbst vorgeschlagen

wir verwenden, um eine zeitempfindliche, einmal Ticket. Es ist wie eine Session-ID von Art. Aber es ist an die Form / Seite gebunden.

Sie verwerfen das Ticket, wenn der Benutzer die Seite einreicht, und Sie nur Prozess-Seiten, die mit einem gültigen Ticket kommt. Sie können zur gleichen Zeit, ziehen Sicherheit durch das Ticket an einen Benutzer angebracht wird, so tun, wenn ein Ticket in dem kommt von einem Benutzer vorgelegt wird, die nicht der Benutzer, die das Ticket eingereicht wurde, können Sie den Antrag ablehnen.

Struts so etwas wie dieses hat gebaut, wenn Sie geschehen, es werden.

http: //struts.apache .org / 1.x / apidocs / org / apache / Streben / util / TokenProcessor.html

Ich würde einen Zeitstempel verwenden und vergleichen Werte mit Ihrem Server-Side-Code. Wenn zwei Zeitstempel sind nah genug und haben die gleiche IP-Adresse, ignorieren Sie das zweite Formular Vorlage.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top