Spamschutz für WPForms und Forminator ohne Captcha
Spamschutz für WPForms und Forminator ohne Captcha heißt: Die Website prüft, ob ein echter Browser das Formular gerendert und abgeschickt hat, statt den Absender um einen Beweis zu bitten. ReportedIP Hive macht genau das für beide Plugins: Die Übermittlung eines Bots wird als formulareigener Fehler über dem Formular abgewiesen, kein Eintrag wird geschrieben, keine Mail geht raus, und ein echter Absender sieht nie ein Rätsel, ein Bild oder einen zusätzlichen Schritt.
Beide Adapter gehören zum Business-Tarif und werden mit je einem Schalter auf der Seite „Schutz” unter „Formularschutz” eingeschaltet. WPForms kam mit Hive 2.1.65, Forminator mit 2.1.66; getestet sind sie gegen WPForms Lite 2.0 und Forminator 1.57.
Warum ein Captcha das falsche Werkzeug für ein Kontaktformular ist
Ein Captcha lässt die falsche Person arbeiten. Der Absender, der Sie erreichen will, liest verzerrte Buchstaben oder klickt auf Ampeln; das Skript, das das Formular flutet, hätte es ohnehin nie gelöst und zieht weiter zu einer Website mit einem schwächeren. Jeder gescheiterte Versuch kostet Sie eine Nachricht, und Sie erfahren nie, wie viele aufgegeben haben.
Bots kommen in zwei Gruppen, und ein Formular muss beide abfangen. Die erste füllt jedes Feld aus, das sie findet, auch das, das sie auslassen sollte. Die zweite lädt die Seite nie: Sie schickt direkt an den Endpoint, mit einer Nutzlast, die von einer echten Übermittlung kopiert wurde. WPForms und Forminator bringen je ein Honeypot-Feld für die erste Gruppe mit. Die zweite läuft an einem Honeypot vorbei, weil sie das Markup, das ihn trägt, nie rendert.
Wie der Ausführungsnachweis eine Übermittlung von WPForms oder Forminator bewertet
Hive setzt in jedes Formular beider Plugins ein unsichtbares Ankerfeld, aus der Tab-Reihenfolge und für Screenreader ausgenommen. Ein kleines Skript fügt ein zweites Feld hinzu, dessen Name auf jeder Installation anders ist, sodass eine auf einer Website aufgezeichnete Nutzlast auf keine andere passt. Beim Absenden liest der Server beide Felder zurück und sortiert die Anfrage in eine von vier Bewertungen:
| Bewertung | Was die Übermittlung enthielt | Was passiert |
|---|---|---|
proved | Anker leer, Prüffeld vorhanden | Ein Browser hat das Formular gerendert und sein Skript ausgeführt. Der Eintrag wird gespeichert. |
tripped | Das Ankerfeld, ausgefüllt | Abgewiesen. Ein ausgefülltes unsichtbares Feld ist Automatisierung ohne harmlose Erklärung. Die Adresse wird beim ersten Versuch gesperrt und gemeldet. |
failed | Anker leer, Prüffeld fehlt, die Website weiß, dass sie das Feld rendert | Abgewiesen. Die Seite wurde abgerufen, das Skript lief nie. Die Adresse wird nicht gezählt. |
absent | Keines der beiden Felder vorhanden | Nachsichtig. Hive hat sich auf dieser Website noch nicht selbst beim Rendern des Feldes gesehen, also wird nichts bewertet. |
Nichts Anfragespezifisches gelangt ins HTML. Der Anker ist bei jedem Seitenaufruf derselbe und der zufällige Name lebt im Skript, sodass ein Seitencache das Formular beliebig lange weiter ausliefern kann, ohne dass ein einziger Besucher ausgesperrt wird. Die Regel hinter den vier Bewertungen ist eine Methode, die alle geschützten Formulare teilen, sodass WPForms, Forminator, das Kommentarformular und die WordPress-Registrierung denselben Beweis auf dieselbe Weise lesen.
WPForms: Der Anker sitzt vor dem Absenden-Button
WPForms feuert wpforms_display_submit_before innerhalb des Formularelements direkt vor dem Absenden-Button, beim Seitenaufruf und auf dem Hintergrundpfad gleichermaßen, und nur, wenn das Plugin ein eigenes Formular rendert. Hive schreibt den Anker dorthin. Die Bestätigungsmeldung wird woanders gerendert, sodass der Anker nie neben einem Dankestext landet.
Die Bewertung wird auf wpforms_process abgeliefert, der feuert, nachdem das Plugin jedes Feld validiert hat und bevor es einen Eintrag schreibt oder eine Mail schickt. Eine Abweisung, die an diesem Punkt in die Fehlerliste des Prozessors gelegt wird, stoppt beides. WPForms rendert diese Liste über dem Formular als eigenen Header-Fehler, beim Neuladen der Seite und in der Hintergrundantwort gleichermaßen, sodass der Absender immer liest, warum nichts gesendet wurde. Feldfehler kommen konstruktionsbedingt zuerst: Der Hook wird nicht erreicht, solange irgendein Feld ungültig ist, sodass ein unvollständiges Formular keine Abfrage kostet.
Die Browserseite braucht keinen eigenen Hook. WPForms validiert im Submit-Event des Formulars, und genau auf das hört Hives Skript bereits, sodass das Prüffeld gefüllt wird und der festgehaltene Submit unverändert funktioniert. Eine Sache musste erzwungen werden: Das Stylesheet des Plugins setzt versteckte Elemente zurück, was das Köderfeld auf die Seite gestellt hatte, wo ein Besucher es ausfüllen konnte. Die Off-Screen-Regel des Köderfelds gewinnt jetzt gegen diesen Reset.
Forminator: Der Anker sitzt im Submit-Block, die Bewertung in der Fehlerliste
Forminator baut den Block mit seiner Nonce und dem Absenden-Button über forminator_render_form_submit_markup, und dieser Block steht immer innerhalb des Formularelements, beim Rendern zum Seitenaufruf und beim AJAX-Rendern gleichermaßen. Forminator hängt aus demselben Grund seinen eigenen Honeypot dorthin, und Hive hängt seinen Anker an. Der weitere Filter forminator_render_form_markup wäre falsch: Sein Markup reicht über das schließende Formular-Tag hinaus, sodass ein angehängtes Feld außerhalb des Formulars landen würde.
Die Bewertung landet auf forminator_custom_form_submit_errors, dem zweiten Schritt des Übermittlungs-Handlers, bevor das Eintragsobjekt gebaut wird, bevor es gespeichert wird und lange bevor die Mail geschickt wird. Eine nicht leere Fehlerliste stoppt dort den Handler, und Forminator antwortet mit der Liste, die der Absender am Formular liest. Nichts wird gespeichert, nichts wird gesendet, kein Add-on läuft. Forminator ordnet jeden Fehler einer Feld-ID zu und rendert die Meldung neben diesem Feld, sodass die Abweisung am ersten Feld der Übermittlung hängt. Der Hook feuert ein zweites Mal, während Anhänge verarbeitet werden; eine Abweisung, die schon in der Liste steht, wird nie doppelt eingetragen.
Ein nachgeladenes Formular wird wie eines in der Seite bewertet
Ein Forminator-Formular kann nachträglich in die Seite geladen werden, und beide Plugins rendern ein Formular nach einer gescheiterten Validierung neu. Die Serverseite ist abgedeckt, weil der Anker im eigenen Rendern des Plugins mitfährt, egal welcher Pfad es erzeugt hat. Die Browserseite ist beim Absenden abgedeckt: Hives Skript reagiert auf das Submit-Event, und wenn noch keine berechnete Antwort vorrätig ist, hält es den Submit höchstens acht Sekunden fest, holt eine und schickt das Formular dann genau so weiter, wie der Besucher es abgeschickt hat. Ein Besucher, der klickt, bevor die Aufgabe zurück ist, ist kein Bot, und ein leeres Feld hätte ihn abgewiesen.
Warum eine abgewiesene Übermittlung ein Fehler ist und kein Eintrag im Spam-Ordner
Beide Plugins bieten einen Spam-Ordner. WPForms kann einen Eintrag als Spam markieren, und Forminators eigener Spam-Filter legt eine Übermittlung in den Spam-Ordner und zeigt dem Absender, je nach Einstellung des Formulars, eine Erfolgsmeldung. Hive nutzt beides nicht, mit Absicht. Ein Eintrag im Spam-Ordner ist eine Nachricht, für die dem Absender gedankt wurde und die der Betreiber nie liest. War die Bewertung falsch, glaubt die Person, die Ihnen geschrieben hat, ihre Nachricht sei angekommen, und wartet auf eine Antwort, die nie kommt.
Eine Abweisung von Hive ist stattdessen der formulareigene Fehler: der Header-Fehler, den WPForms für sein eigenes „form has not been submitted” nutzt, die Feldfehlerliste, die Forminator für ein leer gelassenes Pflichtfeld nutzt. Der Absender sieht die Meldung am Formular, kann lesen, warum, und es erneut versuchen. Kein Eintrag wird geschrieben, keine Benachrichtigung geht raus, und keine Bestätigung wird angezeigt. Dieses Plugin verliert nie eine Nachricht, ohne es dem Absender wenigstens zu sagen.
Was ein Bot sieht und was ein Besucher sieht
| Echter Besucher | Skript, das an den Endpoint schickt | Bot, der jedes Feld ausfüllt | |
|---|---|---|---|
| Lädt die Seite | Ja | Nein | Ja |
| Führt das Skript aus | Ja | Nein | Meist nicht |
| Prüffeld | Vorhanden | Fehlt | Fehlt oder falsch |
| Ankerfeld | Leer | Leer oder fehlt | Ausgefüllt |
| Zusätzlicher Schritt für den Menschen | Keiner | ||
| Ergebnis | Eintrag gespeichert | Am Formular abgewiesen | Abgewiesen, Adresse gesperrt und gemeldet |
Was die Prüfung nicht kann: eine Person von einem Botnetz unterscheiden, das einen echten Browser steuert. Sie unterscheidet einen Browser von einem Skript. Für die Adresse hinter dem Browser führt Hive eine zweite, unabhängige Prüfung durch: Die Community-Bedrohungsprüfung weist eine Übermittlung von einer Adresse ab, der die Website eine Anmeldung verweigern würde, auf der Schutzstufe, die die Anmeldeseite durchsetzt, und der Absender erfährt, warum. Diese Prüfung braucht den Community-Network-Modus; der Ausführungsnachweis funktioniert auch im Local-Shield-Modus, ohne dass etwas die Website verlässt.
Was ein ausgefülltes Köderfeld die Adresse kostet
Ein Feld auszufüllen, das niemand sehen kann, erfordert eine Maschine, also wartet Hive nicht auf einen zweiten und dritten Versuch, bevor es handelt. Eine Übermittlung mit ausgefülltem Anker geht direkt auf die Sperrleiter und in die Community-Meldung, so wie der Kommentarfilter denselben Beweis seit 2.1.52 behandelt; die Meldung nennt das Formular, über das sie kam. Eine Adresse auf Ihrer Whitelist ist ausgenommen, weil die Abfrage im Dispatcher sitzt, in dem jeder Sensor am Ende landet, nicht im Zähler, den ein schneller Sensor überspringt.
Ein Besucher, dessen Browser das Skript schlicht nie ausgeführt hat, ist davon nicht betroffen. Seine Übermittlung wird mit einer Meldung abgewiesen, die den Grund nennt, und seine Adresse wird nie gezählt, denn ein fehlender Nachweis ist kein Beweis für eine Maschine.
In vier Schritten einschalten
- Aktualisieren Sie auf Hive 2.1.66 oder neuer mit einem Business-Tarif. In einem niedrigeren Tarif bleiben die Schalter für WPForms und Forminator sichtbar und gesperrt, der benötigte Tarif steht daneben.
- Schalten Sie den WPForms- oder Forminator-Schalter ein auf der Seite „Schutz” unter „Formularschutz”. Das Einschalten leert die gängigen Seitencaches, und 24 Stunden lang wird eine Übermittlung ohne Nachweis weiterhin angenommen, sodass eine ohne das Feld gecachte Seite niemanden aussperren kann. Der Filter
reportedip_hive_form_adapters_graceverschafft auf einer Website, deren Cache länger als einen Tag lebt, mehr Spielraum. - Starten Sie den Selbsttest unter „Werkzeuge” → „Diagnose”. Die Karte listet, was eingeschaltet ist, und fährt dann drei Durchläufe mit dem Browser, vor dem Sie sitzen: wie ein Besucher, wie derselbe Besucher zweimal und wie ein Bot. Kein echtes Formular wird abgeschickt, keine Mail geht raus, kein Eintrag wird gespeichert.
- Beginnen Sie optional im Nur-Melden-Modus, der jede Bewertung protokolliert und nichts abweist. Eine Woche Protokoll zeigt, was abgewiesen worden wäre, bevor etwas abgewiesen wird.
Die Berechnungsprüfung, ab Professional enthalten und damit auch in Business, schließt die eine Abkürzung, die das einfache Prüffeld offen lässt: den Feldnamen aus der Seite lesen und zurückschicken. Der Browser holt eine kleine Aufgabe von Ihrer eigenen Website und rechnet sie im Hintergrund aus; die Aufgabe ist mit dem Salt der Website signiert, zehn Minuten gültig und wird einmal akzeptiert, und der Absender merkt weiterhin nichts. Sie braucht HTTPS; ohne HTTPS behält die Aufgabe Signatur, Ablauf und Einmalgültigkeit, trägt aber keine Rechnung.
Welche Formular-Plugins denselben Schutz bekommen
| Formular | Tarif | Getestet mit |
|---|---|---|
| Kommentar-, Registrierungs- und Passwort-vergessen-Formular | Free | WordPress-Core, WooCommerce, Multisite |
| Ihre eigenen Formulare, über die Formular-API | Free | Drei Aufrufe: field, check, passes |
| Contact Form 7 | Jeder Tarif | Die auf wordpress.org veröffentlichte Version |
| WPForms und WPForms Lite | Business | WPForms Lite 2.0, Seitenaufruf- und Hintergrundpfad |
| Forminator | Business | 1.57, Formulare in der Seite und nachgeladene Formulare |
| Gravity Forms | Business | 3.1, einschließlich mehrseitiger und im Hintergrund gesendeter Formulare |
| Formidable Forms und Formidable Forms PRO | Business | 6.35 |
| Elementor Forms | Business | Elementor PRO 3.34, das Formular-Widget gibt es nur dort |
| Ultimate Member | Business | 2.13, Anmelde-, Registrierungs- und Passwortformulare |
Jedes Plugin hat seinen eigenen Schalter. Die ganze Schicht, der Hauptschalter, ein zweiter Schalter, der Registrierung und Passwort-Zurücksetzen auslässt, und der Nur-Melden-Modus sitzen zusammen auf der Seite „Schutz”. REPORTEDIP_HIVE_DISABLE_FORM_PROOF in der wp-config.php schaltet die Schicht ab, für den Fall, dass ein Besucher nicht absenden kann und Sie die Website zum Laufen bringen müssen, bevor Sie debuggen.
Häufig gefragt
Brauchen WPForms oder Forminator mit eingeschaltetem Hive noch ein Captcha?
Nicht gegen Skripte und Bots. Der Ausführungsnachweis fängt eine Übermittlung, die das Formular nie gerendert hat, und einen Bot, der das unsichtbare Feld ausfüllt, und die Community-Bedrohungsprüfung weist eine Adresse ab, die das Netzwerk schon kennt. Ein Captcha fügt dem nichts hinzu außer einem Schritt, den der Absender gehen muss. Was kein Feld kann, ist eine Person von einem Botnetz zu unterscheiden, das einen echten Browser steuert, und das kann ein Captcha auch nicht.
Funktioniert es neben Akismet, dem Anti-Spam-Token von WPForms oder dem Forminator-Honeypot?
Ja. Hive bewertet die Übermittlung auf dem Verarbeitungs- oder Validierungs-Hook des Plugins, bevor ein Eintrag existiert. Eine abgewiesene Übermittlung erreicht nie die Eintragsliste, den Spam-Ordner oder eine andere Anti-Spam-Prüfung. Alles, was durchkommt, läuft weiter durch die Prüfungen, die Sie ohnehin betreiben.
Was passiert mit einem Besucher, der JavaScript abgeschaltet hat?
Auf den Formular-Plugins wird eine Übermittlung ohne Nachweis mit einer Meldung abgewiesen, die den Grund nennt, weil es auf einem Kontaktformular keine Moderationswarteschlange gibt, auf die man zurückfallen könnte. Die Adresse wird nicht gezählt und nicht gesperrt. Eine Website mit vielen solchen Besuchern kann die Schicht im Nur-Melden-Modus betreiben oder die Schalter für WPForms und Forminator aus lassen und die kostenlosen Formulare weiter abdecken.
Verlangsamt die Prüfung das Formular oder bricht sie das Seiten-Caching?
Nein. Der Anker ist bei jedem Seitenaufruf identisch und nichts Anfragespezifisches gelangt ins HTML, sodass eine gecachte Seite gültig bleibt. Das Skript füllt beim Absenden ein Feld und misst, wie lange das Formular auf dem Bildschirm war; der Startpunkt kommt aus dem Browser, nie aus dem Markup, sodass eine gecachte Seite keinen veralteten tragen kann. Die Rechenaufgabe reist in einem POST, den kein Cache speichert.
Ist das DSGVO-konform?
Der Nachweis sammelt nichts über den Besucher außer der Frage, ob zwei versteckte Felder beim Absenden vorhanden waren und wie viele Sekunden das Formular auf dem Bildschirm war. Kein Fingerprinting, keine Anfrage an Dritte, kein Bild von einer anderen Domain. Im Local-Shield-Modus verlässt gar nichts die Website. Die Dokumentation zum WordPress-Plugin enthält die vollständige Übersicht zur Datenverarbeitung.
Weiterführende Artikel
- Gravity Forms ohne Captcha: der Adapter für ein Plugin, das seine Formulare selbst abschickt
- Formular-Honeypot und Ausführungsnachweis: die vier Bewertungen und wie das Kommentarformular sie gewichtet
- Release-Notizen zu Hive 2.1.66: die eine Regel, die jetzt alle Formulare teilen
Die Dokumentation zum WordPress-Plugin enthält die vollständige Referenz der Einstellungen, der Tarifvergleich zeigt, was Business enthält. ReportedIP Hive entdecken →