Krasser: Merfachabsenden eines Formulars unterbinden - wie macht ihr das?

tach

Wie verhindert ihr das mehrfachabsenden eines Formulars?
Ich hab bisher immer ein Cookie gesetzt und dann geschaut obs funktioniert.
Aber wenn zum Beispiel jemand im Admin Menü mehrere Einträge hintereinander löschen will, und ein Cookie gesetzt ist, kann er nur einen Eintrag löschen, danach ja nicht mehr. Wenn ich das Cookie zeitlich berenze auf 20 sek. Muss er entweder immer warten oder er hat das Problem immernoch, wenn er mal kurz auf Toilette war.

Wie verhindert ihr das?
Gibts da keine Möglichkeit nen PHP-Header zu setzen o.ä.?
Oder mit Javascript das ganz zu unterbinden - was ich eher doof fände des damit zu machen.

grüße, der Krasse

  1. Hello,

    Wie verhindert ihr das mehrfachabsenden eines Formulars?

    Das geht nur mit einer clientseitigen Sprache, also z.B. mit JavaScript

    Die mehrfache Weiterverarbeitung auf dem Server kann aber verhindert werden, wenn Du dem Formular einen Unique Key gibst, z.B. als Hidden-Element.

    Dann kannst Du nach der Datenübernahme in Deiner Datenbank nachschauen lassen, ob der der Key schon vohanden ist. Ist er da, kannst Du dir die Weiterverarbeitung des Requests zum größten teil sparen. Der User sollte natürlich noch eine Nachricht mit dem nächsten möglichen Schritt als Link oder Button bekommen.

    Oder aber, Du legst es einfach darauf an. Wenn in der Tabelle ein Unique Contraint auf die Spalte gesetzt ist, wird der Eintrag ja ohnehin abgelehnt. Den benötigst Du ja sowieso (auch wenn Du vorher abfragst), damit Du Dir kein TOCTOU-Problem baust. (Race Condition zwischen nebenläufigen Prozessen).
    http://en.wikipedia.org/wiki/Time-of-check-to-time-of-use

    Für die Unique-ID eigent sich z.B. beim Apache Webserver $_SERVER['UNIQUE_ID']. Das ist aber nur vorhanden, wenn das passende Modul auch geladen ist.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Man wird beim aktualisieren ja gefragt "Neu senden"?..

      Ich möchte das diese Abfrage nicht mehr erscheint.
      Ich möchte dann F5 oder strg+R drücken können und die Seite wird ganz normal aktualsiert.

      ist das irgendwie möglich?

      Wenn mit JS - wie?

      1. Hi,

        Man wird beim aktualisieren ja gefragt "Neu senden"?..

        Ja - und zwar genau dann, wenn die aktuelle Ressource per POST angefordert wurde.

        Ich möchte das diese Abfrage nicht mehr erscheint.
        Ich möchte dann F5 oder strg+R drücken können und die Seite wird ganz normal aktualsiert.

        Dann sorge dafür, dass die aktuell angezeigte Ressource *nicht* per POST angefordert wurde.

        ist das irgendwie möglich?

        Bspw. per serverseitiger Weiterleitung nach dem POST, so dass der Browser eine neue Ressource wieder per GET anfordert.
        Das Thema ist nicht neu, Archivsuche weiss mehr.

        MfG ChrisB

        --
        Light travels faster than sound - that's why most people appear bright until you hear them speak.
      2. Hello,

        Man wird beim aktualisieren ja gefragt "Neu senden"?..

        Das hast Du eben aber so nicht gesagt.
        Es handelt sich hier auch um mehrere Dinge, die Du beachten musst.

        1. Abfangen eines Mehrfachposts, der bei manchen Browsern möglich ist,
           solange noch kein Response eingetroffen ist
          (wie das serverseitig geht, habe ich beschrieben)

        2. Rücksetzen der Seite, damit sie die gespeicherten Postdaten verwirft
           und auch bei History-Back nicht nochmal sendet.
           Dafür ist der Statuscode 205 da
           Der hat nur den Nachteil, dass Du kein response-Body mitsenden kannst
           Den musst Du Dir dann über einen Location Header extra anfordern.

        Dazu benötigt man schon fast wieder eine Session. Man will dem User
           schließlich die eingetragenen Daten nochmals vorlegen

        3. Damit der Request auch bei einem Multipost vollständig abgearbeitet
           wird und keine halben Sachen in Datenbanken oder Datein eingetragen
           werden, muss man den User-Abort während der Formularverarbeitung auf
           dem Server abschalten.
           http://de3.php.net/manual/en/function.ignore-user-abort.php

        Sollte nämlich der Folgerequest noch während des bereits laufenden
           ausgelöst werden, könnte die Barbeitung des bereits laufenden einfach
           mittendrin abgebrochen werden. Müssen nun aufwändige von einander abhängige
           Datenmanipulationen durchgeführt werden, könnten die damit inkonsistent werden.

        Außerdem kannst Du noch auf dem Client mittels JavaScript den Submit-Button abschlaten, wenn er einmal gedrückt wurde.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de