Hi, wie im Titel dieses Threads bereits erwähnt, möchte ich eine IP-Sperre realisieren, die verhindert, dass man mit derselben IP ständig dasselbe Formular absenden kann. Bei der Realisierung gibt es einige Schwierigkeiten und ich hoffe, hier im Forum Hilfe zu erhalten.
Zum Hintergrund: Die Formulare einiger TL-Websites, die ich betreue, wurden von einem "Spaßvogel" angegriffen, indem er diese automatisiert und befüllt mit reinem Müll zigtausendfach abgesendet hat. Ich habe nun die Sicherheitsfrage eingefügt, aber - bitte korrigiert mich, wenn ich mich hier täusche - so richtig sicher scheint mir die nicht zu sein. Die Fragen unterscheiden sich nur minimal (z. B. "Was ist die Summe aus 7 und 5", "Bitte rechnen Sie 4 plus 8", "Bitte addieren Sie 3 und 8"), sodass es doch in kürzester Zeit machbar ist, automatisiert die richtige Antwort zu ermitteln und die Sicherheitsabfrage auszuhebeln. Hat man das einmal gemacht, kann man den Angriff locker auf alle normalen TL-Seiten anwenden.
Ein grafisches Captcha einzubinden ist sicher eine Option, aber das müsste dann schon eines sein, das aus Gründen der Barrierefreiheit auch vorgelesen werden kann und allgemein finde ich Captchas für Laien etwas verwirrend. Angeblich hat man durch Verwendung von Captchas außerdem mit Benutzerabbrüchen vor dem Versenden von Formularen zu rechnen. Ich möchte deshalb auf ein richtiges, grafisches Captcha verzichten.
Jedenfalls halte ich die IP-Sperre für eine gute Idee.
Zum konkreten Programmierproblem:
Damit es updatesicher ist, möchte ich die vorbereiteten TL-Hooks verwenden, es bietet sich hier "processFormData" an. Da dieser Hook allerdings nach dem Versenden der Daten per E-Mail bzw. dem Speichern in die DB stattfindet, ist das, was ich abfangen möchte, bereits passiert.
Ich könnte nun die Verarbeitung der Formulardaten (per Mail senden oder speichern) auf mein Modul auslagern, sodass all dies in meiner per Hook eingebundenen Funktion stattfindet. Das möchte ich eigentlich aber nicht machen, da es unschön ist, hier quasi den identischen Code zur Verarbeitung redundant zu haben.
Meine Lösung wäre es nun, das Formular so einzustellen, dass es von alleine die Daten gar nicht verarbeitet und mittels weiterer Einstellungsfelder so zu definieren, dass es nach der IP-Prüfung verarbeitet wird. Ich würde also das Häkchen bei "Eingaben speichern" und "per E-Mail senden" NICHT setzen und dafür die Häkchen bei neuen Feldern namens "Eingaben nach IP-Prüfung speichern" oder "nach IP-Prüfung per E-Mail senden" setzen.
Es würde also nichts passieren, bevor meine eigene Funktion über den Hook aufgerufen würde. Nun könnte die Funktionalität zur IP-Prüfung stattfinden.
Und nun kommt der Clou: Ich möchte nun gerne - sofern die IP akzeptiert wird - den gesamten Verarbeitungsprozess des Formulars erneut aufrufen, dann allerdings die entsprechenden Flags für "Eingaben speichern" oder "per E-Mail senden" setzen. Bei diesem erneuten Aufruf würde die per Hook eingebundene Funktion natürlich nichts mehr machen.
Diese Idee scheint mir der minimalste funktionierende Eingriff zu sein.
Meine Frage ist nun: Wie kann ich denn aus der per Hook eingebundenen, eigenen Funktion die Verarbeitung des Formulars - also die Funktion "processFormData" in der Datei "Form.php" - erneut aufrufen? Ich dachte schon daran, per header() die aktuelle URL nochmal aufzurufen, aber da kann ich die POST-Daten nicht übermitteln... Hat jemand eine Idee?!?
Und falls mir jemand plausibel erklären kann, weshalb der ganze Aufwand unnötig ist, wäre ich auch dankbar. Aber ich kann mir einfach nicht vorstellen, dass die Sicherheitsabfrage wirklich sicher ist.
Danke im Voraus!
Lesezeichen