Lude: Verhindern, dass Formulare mehrfach abgeschickt werden

Hi,

was ist denn hier die Forumsmeinung (bzw. die Meinung deren Meinungsfuehrer)? Wie bearbeitet man das Problem am besten? Unterschiede bei den Browsern?

Gruss,
Lude

  1. Hallo Lude,

    was ist denn hier die Forumsmeinung (bzw. die Meinung deren Meinungsfuehrer)? Wie bearbeitet man das Problem am besten? Unterschiede bei den Browsern?

    also ich meine, dass es nicht 100%ig verhinderbar ist. Aber zum Beispiel das mehrfache Klicken auf den Submit-Button kann man verhindern, indem man serverseitig eindeutige IDs erzeugt, diese IDs in einer Liste vorhält und beim Eintreffen eines Formulars mit einer IDs die ID als "abgearbeitet" kennzeichnet. Kommen weitere Anfragen mit einer bereits "abgearbeiteten" ID, kann man eine Fehlermeldung senden oder die Anfrage im off verschwinden lassen.

    Als Methode zur ID-Erzeugung würde ich einen Zeitstempel samt Zufallszahl mit MD5 hashen. Das ergibt "extrem eindeutige" Strings, die sich wunderbar für diesen Zweck eignen.

    Für die Sicherheit bei Umfragen kann man natürlich jede Menge Rahmenbedingungen heranziehen, um den Benutzer zu identifizieren (IP-Adresse, Browser-Identifikation, evtl. Cookie und einiges mehr). Jedoch sind alle diese Rahmenbedingungen vom Nutzer beeinflussbar und somit gibt es keinen _effektiven_ Schutz vor Mehrfachabstimmungen.

    Der einzige Schutz ist ein Login mit Identitätsverifizierung, was aber in den allermeisten Fällen wohl "overdressed" wäre.

    viele Grüße
      Achim Schrepfer

    --
    »Wenn die meisten sich schon armseliger Kleider und Möbel schämen, wieviel mehr sollten wir uns da erst armseliger Ideen und Weltanschauungen schämen.« - Albert Einstein
    Selfcode: sh:) fo:| ch:| rl:° br:> n4:{ ie:% mo:} va:| de:< zu:| fl:( ss:) ls:& js:|
    1. Hallo, Achim,

      genau das habe ich vermutet. JavaScript-Loesungen scheiden aus, so dass Eindeutigkeiten auf Formulare (und ggf. Sitzungen) gebildet werden muessen.

      Warum programmieren die verdammten Browserhersteller Ihre Browser eigentlich nicht einfach so, dass Formulare nur einmal versandt werden koennen? Da scheint es doch kein einziges Gegenargument zu geben!

      Gruss,
      Lude

      1. Hi, Lude,

        Warum programmieren die verdammten Browserhersteller Ihre Browser eigentlich nicht einfach so, dass Formulare nur einmal versandt werden koennen? Da scheint es doch kein einziges Gegenargument zu geben!

        Gegenargument: Wenn ein Formular nicht komplett oder falsch ausgefüllt wurde, kommt vom Server eine Fehlermeldung. Ich nutze dann den Back-Button, um auf mein ausgefülltes Formular zurückzugehen und es zu korrigieren. Dann nochmal Klick auf ABSENDEN.

        Kommt oft vor, dass Felder nicht als Pflichtfelder gekennzeichnet sind, aber doch Eingaben zwingend sind ==> Luschige Programmierung !

        Was ich auch schon hatte im INPUT TYPE='text': "Ihre Eingabe ist zu lang!" Warum läßt man die lange Eingabe zu ?

        Lieben Gruß aus Worms, Kalle

        1. Hi,

          Warum programmieren die verdammten Browserhersteller Ihre Browser eigentlich nicht einfach so, dass Formulare nur einmal versandt werden koennen? Da scheint es doch kein einziges Gegenargument zu geben!

          Gegenargument: Wenn ein Formular nicht komplett oder falsch ausgefüllt wurde, kommt vom Server eine Fehlermeldung. Ich nutze dann den Back-Button, um auf mein ausgefülltes Formular zurückzugehen und es zu korrigieren.

          Genau dann sollte doch der Server antworten und nicht anforderungsgerecht ausgefuellte Formularfelder beispielsweise farblich markieren.

          Dann nochmal Klick auf ABSENDEN.

          Praktisch, aber ein Preis wird gezahlt, der zu hoch ist.

          Kommt oft vor, dass Felder nicht als Pflichtfelder gekennzeichnet sind, aber doch Eingaben zwingend sind ==> Luschige Programmierung !

          Also eine Funktionalitaet fuer die Luschen, das Erlauben mehrfachen Absendens.

          Was ich auch schon hatte im INPUT TYPE='text': "Ihre Eingabe ist zu lang!" Warum läßt man die lange Eingabe zu ?

          Ich weiss warum, weil die Logik naemlich aus einem JavaScript kommt, das nur den Variablennamen auswertet. Ist gar nicht so doof, wie es im ersten Momemnt erscheint.

          Lieben Gruß aus Worms, Kalle

          Viele Gruesse,
          Lude

      2. Moin!

        Warum programmieren die verdammten Browserhersteller Ihre Browser eigentlich nicht einfach so, dass Formulare nur einmal versandt werden koennen? Da scheint es doch kein einziges Gegenargument zu geben!

        Ein Formularabschicken ist technisch gesehen nur ein HTTP-Request. Willst du also pro Browser nur eine einzige Seite kriegen? Denn das würde es bedeuten, wenn die Hersteller was dagegen unternehmen würden.

        Nein, dein Vorschlag ist unsinnig! Ein Browser soll gefälligst tun, was ich will. Wenn ich ein Formular doppelt abschicken will, ist das meine Sache.

        Wenn _du_ dagegen ein doppelt abgeschicktes Formular nicht haben willst, gibt es im </archiv/> genügend Strategien, die das verhindern können. Und das tun sie, wie ich finde, eigentlich auch ganz in Ordnung.

        - Sven Rautenberg

        --
        Signatur oder nicht Signatur - das ist hier die Frage!
        1. Hi,

          Warum programmieren die verdammten Browserhersteller Ihre Browser eigentlich nicht einfach so, dass Formulare nur einmal versandt werden koennen? Da scheint es doch kein einziges Gegenargument zu geben!

          Ein Formularabschicken ist technisch gesehen nur ein HTTP-Request. Willst du also pro Browser nur eine einzige Seite kriegen? Denn das würde es bedeuten, wenn die Hersteller was dagegen unternehmen würden.

          Moment, ich habe die Funktionalitaet "pro form nur ein Absenden" angefordert. Das ist natuerlich; stelle Dir doch mal vor es ist Dir moeglich ein und denselben Brief mehrfach abzusenden. Sollte so etwas EDV-technisch abgebildet sein, wuerde ich von einem Design-Fehler sprechen, da die Realitaet unzureichend abgebildet ist.

          "Willst du also pro Browser nur eine einzige Seite kriegen?..." - Deiner Argumentation kann ich nicht folgen.

          Nein, dein Vorschlag ist unsinnig!

          Warum, weshalb, wieso?

          Ein Browser soll gefälligst tun, was ich will. Wenn ich ein Formular doppelt abschicken will, ist das meine Sache.

          Also ein Designfehler, der breite Akzeptanz zu haben scheint.

          Wenn _du_ dagegen ein doppelt abgeschicktes Formular nicht haben willst, gibt es im </archiv/> genügend Strategien, die das verhindern können. Und das tun sie, wie ich finde, eigentlich auch ganz in Ordnung.

          Klar kann man den Fehler mit Aufwand versuchen totzuschlagen.

          Gruss,
          Lude

      3. Hallo Lude,

        Warum programmieren die verdammten Browserhersteller Ihre Browser eigentlich nicht einfach so, dass Formulare nur einmal versandt werden koennen? Da scheint es doch kein einziges Gegenargument zu geben!

        ich glaube, Du verwechselst da etwas. Das eigentliche Problem ist nicht das mehrfache Versenden eines Formulars. Es gibt schliesslich genügend Anwendungen, die ein mehrfaches Versenden ein und desselben Formulars erfordern. Ich denke da z.B. an Redaktionssysteme, Foren oder das Tipps & Tricks-Formular hier auf dem Server.

        Selbst, wenn der Browser verhindern würde, dass ein Formular mehrfach abgeschickt wird (was aus oben genannten Gründen ziemlich blödsinnig wäre), könnte ich mich als Person einfach an einen anderen Rechner setzen oder auch einfach nur einen der vielen anderen Browser benutzen um das Formular wieder und wieder zu verschicken.

        Das eigentliche Problem ist vielmehr, dass HTTP nicht in der Lage ist, den Benutzer eindeutig zu identifizieren (jedenfalls nicht ohne ein Login, wie ich es im Vorposting beschrieben habe). Solange das so ist (und es wird so bleiben, weil es nicht die Aufgabe von HTTP ist, Leute zu identifizieren) wird es keine _zuverlässige_ Methode geben dies zu verhindern.

        Das heißt in der Konsequenz einfach, dass man z.B. Umfragen, die sich nicht an einen geschlossenen und zuverlässig identifizierten Benutzerkreis wenden, nicht trauen kann.

        viele Grüße
          Achim Schrepfer

        --
        »Wenn die meisten sich schon armseliger Kleider und Möbel schämen, wieviel mehr sollten wir uns da erst armseliger Ideen und Weltanschauungen schämen.« - Albert Einstein
        Selfcode: sh:) fo:| ch:| rl:° br:> n4:{ ie:% mo:} va:| de:< zu:| fl:( ss:) ls:& js:|
        1. Hallo, Achim,

          Warum programmieren die verdammten Browserhersteller Ihre Browser eigentlich nicht einfach so, dass Formulare nur einmal versandt werden koennen? Da scheint es doch kein einziges Gegenargument zu geben!

          ich glaube, Du verwechselst da etwas.

          Ich habe noch nie etwas verwechselt.

          Das eigentliche Problem ist nicht das mehrfache Versenden eines Formulars.

          Doch, denn Formulare loesen Requests aus, die Webserver bearbeiten (muessen).

          Es gibt schliesslich genügend Anwendungen, die ein mehrfaches Versenden ein und desselben Formulars erfordern. Ich denke da z.B. an Redaktionssysteme, Foren oder das Tipps & Tricks-Formular hier auf dem Server.

          Also ich habe noch nie ein Formular gesehen, dass mehrfach abgeschickt werden muss.

          Selbst, wenn der Browser verhindern würde, dass ein Formular mehrfach abgeschickt wird (was aus oben genannten Gründen ziemlich blödsinnig wäre),

          Meine Vorschlaege sind nie bloedsinnig.

          könnte ich mich als Person einfach an einen anderen Rechner setzen oder auch einfach nur einen der vielen anderen Browser benutzen um das Formular wieder und wieder zu verschicken.

          Dann ist es aber nicht mehr das selbe Formular, sondern das gleiche Formular.

          Das eigentliche Problem ist vielmehr, dass HTTP nicht in der Lage ist, den Benutzer eindeutig zu identifizieren (jedenfalls nicht ohne ein Login, wie ich es im Vorposting beschrieben habe). Solange das so ist (und es wird so bleiben, weil es nicht die Aufgabe von HTTP ist, Leute zu identifizieren) wird es keine _zuverlässige_ Methode geben dies zu verhindern.

          Das heißt in der Konsequenz einfach, dass man z.B. Umfragen, die sich nicht an einen geschlossenen und zuverlässig identifizierten Benutzerkreis wenden, nicht trauen kann.

          Ich traue sowieso niemandem.

          Gruss,
          Lude
          :-)

          1. Hallo Lude,

            ich glaube, Du verwechselst da etwas.
            Ich habe noch nie etwas verwechselt.

            jaja...

            Das eigentliche Problem ist nicht das mehrfache Versenden eines Formulars.
            Doch, denn Formulare loesen Requests aus, die Webserver bearbeiten (muessen).

            Es ist die verdammte Aufgabe eines Webservers Requests zu bearbeiten!

            Es gibt schliesslich genügend Anwendungen, die ein mehrfaches Versenden ein und desselben Formulars erfordern. Ich denke da z.B. an Redaktionssysteme, Foren oder das Tipps & Tricks-Formular hier auf dem Server.
            Also ich habe noch nie ein Formular gesehen, dass mehrfach abgeschickt werden muss.

            Tja, dann mangelt es Dir an Erfahrung... was machst Du, wenn Du z.B. hier auf dem Server das Tipps & Tricks-Formular verwenden willst, um zwei oder drei Beiträge einzusenden? Dir um die Ecke ein neues Formular kaufen?

            Selbst, wenn der Browser verhindern würde, dass ein Formular mehrfach abgeschickt wird (was aus oben genannten Gründen ziemlich blödsinnig wäre),
            Meine Vorschlaege sind nie bloedsinnig.

            jaja...

            könnte ich mich als Person einfach an einen anderen Rechner setzen oder auch einfach nur einen der vielen anderen Browser benutzen um das Formular wieder und wieder zu verschicken.
            Dann ist es aber nicht mehr das selbe Formular, sondern das gleiche Formular.

            Ja, aber was willst Du jetzt eigentlich!? Warum willst Du denn unbedingt verhindert, dass Formulare mehrfach abgeschickt werden?

            Das heißt in der Konsequenz einfach, dass man z.B. Umfragen, die sich nicht an einen geschlossenen und zuverlässig identifizierten Benutzerkreis wenden, nicht trauen kann.
            Ich traue sowieso niemandem.

            Na dann is ja gut.

            viele Grüße
              Achim Schrepfer

            --
            »Wenn die meisten sich schon armseliger Kleider und Möbel schämen, wieviel mehr sollten wir uns da erst armseliger Ideen und Weltanschauungen schämen.« - Albert Einstein
            Selfcode: sh:) fo:| ch:| rl:° br:> n4:{ ie:% mo:} va:| de:< zu:| fl:( ss:) ls:& js:|
            1. Hi,

              Ja, aber was willst Du jetzt eigentlich!? Warum willst Du denn unbedingt verhindert, dass Formulare mehrfach abgeschickt werden?

              weil Formulare die Schnittstelle zur Datenhaltung sind. Natuerlich waere es z.B. wuenschenswert, wenn ein Nutzer eben nicht durch nervoeses Klicken auf die "submit"-Schaltflaeche z.B. 20 oder mehr Perlprozesse ausloest, die u.a. Mails versenden oder kraeftig in die Datenhaltung wirken. Die dann existierenden redundanten Daten muessen naemlich bearbeitet werden. Doppelte Datensaetze muessen entfernt werden bzw. es muss unterbunden werden, dass Datensaetze mit gleichem Inhalt geschrieben werden u.s.w..

              Dadurch wird alles komplexer als es sein muesste - und darum verstehe ich nicht, warum "die Browser" das Mehrfach-Submit zulassen. - Das ist m.E. eine durchaus wichtige Frage; die Antwort des Forumsbullen Sven hat mir leider nicht gereicht.

              Gruss,
              Lude

              1. Moin!

                Dadurch wird alles komplexer als es sein muesste - und darum verstehe ich nicht, warum "die Browser" das Mehrfach-Submit zulassen. - Das ist m.E. eine durchaus wichtige Frage; die Antwort des Forumsbullen Sven hat mir leider nicht gereicht.

                Das Problem ist komplexer, also du glaubst.

                Woran erkennst du mit Sicherheit, dass zwei aufeinanderfolgende Requests, die neue Datensätze erstellen, durch doppeltes Abschicken des Formulars entstanden sind? Könnten das nicht einfach zwei identische Datensätze sein?

                Woran erkennst du, dass zwei Datensätze, die abgeschickt wurden, zusammengehören bzw. besser nur einer wären, wenn sie sich durch ein oder mehrere Zeichen unterscheiden?

                Du reduzierst das Problem auf "Browser soll nicht zweimal schicken". Das ist aber nicht das Problem. Das Problem ist: Wie erkennt die Datenbank, dass zwei neue Datensätze nur einer sind? Und das wird schwierig.

                Gegen nervöses Klicken helfen eigentlich nur zwei Dinge:
                Erstens: Schnelle Serverantworten. Wenn es Ewigkeiten braucht, bis der Server die Antwortseite generiert hat, dann ist am Design der interaktiven Komponente was faul und sollte korrigiert werden.

                Zweitens: Dir stehen alle Möglichkeiten von Javascript offen, um ein Mehrfachklicken so gut es geht zu unterbinden. Beispielsweise kannst du onsubmit den Submitbutton disablen oder ausblenden - dann kann er nicht mehr geklickt werden. Und wenn du Javascript verpflichtend machst, ist es eigentlich auch kaum zu umgehen. Du kannst als Krönung auch onclick das Formular per Javascript abschicken.

                Was du nicht kannst: Dich gegen Böswilligkeit schützen.

                PS: Den Forumsbullen nehm' ich dir etwas übel.

                - Sven Rautenberg

                --
                Signatur oder nicht Signatur - das ist hier die Frage!
                1. Hi,

                  Das Problem ist komplexer, also du glaubst.

                  Noch komplexer?   :-)

                  Woran erkennst du mit Sicherheit, dass zwei aufeinanderfolgende Requests, die neue Datensätze erstellen, durch doppeltes Abschicken des Formulars entstanden sind? Könnten das nicht einfach zwei identische Datensätze sein?

                  Ich will ja gerade, dass zwei aufeinanderfolgende Requests auch "zwei Datensaetze" generieren.

                  Woran erkennst du, dass zwei Datensätze, die abgeschickt wurden, zusammengehören bzw. besser nur einer wären, wenn sie sich durch ein oder mehrere Zeichen unterscheiden?

                  Ich will das ja gerade nicht erkennen wollen.

                  Du reduzierst das Problem auf "Browser soll nicht zweimal schicken". Das ist aber nicht das Problem. Das Problem ist: Wie erkennt die Datenbank, dass zwei neue Datensätze nur einer sind? Und das wird schwierig.

                  Das ganze Problem ist doch nur existent, weil die dummen Browser den Mehrfachsubmit ein und desselben Formulars "unterstuetzen".

                  Gegen nervöses Klicken helfen eigentlich nur zwei Dinge:
                  Erstens: Schnelle Serverantworten. Wenn es Ewigkeiten braucht, bis der Server die Antwortseite generiert hat, dann ist am Design der interaktiven Komponente was faul und sollte korrigiert werden.

                  Eine Teilloesung. Denn es kommen auch dann immer noch mehrere "Jungs" durch, bevor das Gatter faellt.

                  Zweitens: Dir stehen alle Möglichkeiten von Javascript offen, um ein Mehrfachklicken so gut es geht zu unterbinden. Beispielsweise kannst du onsubmit den Submitbutton disablen oder ausblenden - dann kann er nicht mehr geklickt werden. Und wenn du Javascript verpflichtend machst, ist es eigentlich auch kaum zu umgehen. Du kannst als Krönung auch onclick das Formular per Javascript abschicken.

                  Ich hasse JavaScript. - Aber im Ersnt, ich denke, dass die Browser eben einen Sachverhalt abbilden, der in dieser Realitaet nicht existiert. - Beantworte doch einfach, warum es moeglich sein soll ein und denselben Request mehrfach zu senden? Wer will das denn? Wer braucht das denn? - Das ist doch ein Designfehler, oder?

                  Was du nicht kannst: Dich gegen Böswilligkeit schützen.

                  PS: Den Forumsbullen nehm' ich dir etwas übel.

                  War absolut nicht boese gemeint. Der Bulle geniesst doch einen guten Ruf.

                  Gruss,
                  Lude

              2. Hi,

                weil Formulare die Schnittstelle zur Datenhaltung sind.

                sind sie nicht. Formulare sind höchstens die Schnittstelle der Anwendung zum Benutzer. Die Anwendung reicht die Daten (hoffentlich nach genügender Plausibilitätsprüfung) an die Datenhaltung weiter.

                Natuerlich waere es z.B. wuenschenswert, wenn ein Nutzer eben nicht durch nervoeses Klicken auf die "submit"-Schaltflaeche z.B. 20 oder mehr Perlprozesse ausloest, die u.a. Mails versenden oder kraeftig in die Datenhaltung wirken. Die dann existierenden redundanten Daten muessen naemlich bearbeitet werden. Doppelte Datensaetze muessen entfernt werden bzw. es muss unterbunden werden, dass Datensaetze mit gleichem Inhalt geschrieben werden u.s.w..

                Es ist Sache der Anwendung die Plausibilität der Daten zu prüfen. Und in meinem ersten Posting habe ich einen recht einfachen Weg beschrieben, der zumindest das "nervöse" Submit-Geklicke wirksam unterbindet (eindeutige ID im Formular mitgeben und nur Requests bearbeiten, die eine entsprechende ID in einer Cache-Tabelle besitzen).

                Dadurch wird alles komplexer als es sein muesste - und darum verstehe ich nicht, warum "die Browser" das Mehrfach-Submit zulassen. - Das ist m.E. eine durchaus wichtige Frage; die Antwort des Forumsbullen Sven hat mir leider nicht gereicht.

                Die Antwort darauf ist recht einfach. Es ist nicht die Aufgabe des Browsers. Es ist die Aufgabe des Programmierers sauber auf alle Anfragen zu reagieren.

                viele Grüße
                  Achim Schrepfer

                PS: Forumsbulle!? Was soll das denn sein?

                --
                »Wenn die meisten sich schon armseliger Kleider und Möbel schämen, wieviel mehr sollten wir uns da erst armseliger Ideen und Weltanschauungen schämen.« - Albert Einstein
                Selfcode: sh:) fo:| ch:| rl:° br:> n4:{ ie:% mo:} va:| de:< zu:| fl:( ss:) ls:& js:|
                1. Hi,

                  weil Formulare die Schnittstelle zur Datenhaltung sind.

                  sind sie nicht. Formulare sind höchstens die Schnittstelle der Anwendung zum Benutzer. Die Anwendung reicht die Daten (hoffentlich nach genügender Plausibilitätsprüfung) an die Datenhaltung weiter.

                  http://selfhtml.teamone.de/html/formulare/definieren.htm

                  Natuerlich waere es z.B. wuenschenswert, wenn ein Nutzer eben nicht durch nervoeses Klicken auf die "submit"-Schaltflaeche z.B. 20 oder mehr Perlprozesse ausloest, die u.a. Mails versenden oder kraeftig in die Datenhaltung wirken. Die dann existierenden redundanten Daten muessen naemlich bearbeitet werden. Doppelte Datensaetze muessen entfernt werden bzw. es muss unterbunden werden, dass Datensaetze mit gleichem Inhalt geschrieben werden u.s.w..

                  Es ist Sache der Anwendung die Plausibilität der Daten zu prüfen. Und in meinem ersten Posting habe ich einen recht einfachen Weg beschrieben, der zumindest das "nervöse" Submit-Geklicke wirksam unterbindet (eindeutige ID im Formular mitgeben und nur Requests bearbeiten, die eine entsprechende ID in einer Cache-Tabelle besitzen).

                  Das mit den eindeutigen IDs ist wie Du schreibst aufwendig und darum auch komplexer als es sein muesste, wenn eine form eben nur einmal submitted werden kann. "Alles so einfach wie moeglich..." (A.Einstein) - Gerade im IT-Bereich ein Naturgesetz.

                  Dadurch wird alles komplexer als es sein muesste - und darum verstehe ich nicht, warum "die Browser" das Mehrfach-Submit zulassen. - Das ist m.E. eine durchaus wichtige Frage; die Antwort des Forumsbullen Sven hat mir leider nicht gereicht.

                  Die Antwort darauf ist recht einfach. Es ist nicht die Aufgabe des Browsers. Es ist die Aufgabe des Programmierers sauber auf alle Anfragen zu reagieren.

                  Deine Antwort darauf ist einfach, weil Du eben weisst, was Programmierer machen muessen und was Browser leisten muessen. Mir als evolutionsglaeubiger Anti-Ideologe fallen solche sichere Antworten naturgemaess schwerer.

                  PS: Forumsbulle!? Was soll das denn sein?

                  War doch treffend, oder?

                  Gruss,
                  Lude
                  :-)