PHP Formular Spamschutz und Validierung – Spam Emails verhindern auch ohne Captcha

Dieser Beitrag ist veraltet!
Es werden an diesem Beitrag keine Aktualisierungen mehr vorgenommen. Es besteht die Möglichkeit, dass im Beitrag gezeigte Lösungsansätze oder enthaltene Links/Verweise nicht mehr funktionieren.

Spamschutz ohne Captcha? Geht das, wenn ja wie? Das folgende Tutorial zeigt Möglichkeiten auf die lästigen Captcha zu verzichten.

Spam Emails aus Formularen verhindern

Spammer benutzen Spambots  die das Internet nach Formularen durchsuchen und diese automatisch auszufüllen und abzusenden. Gängige Abwehrmethode ist das bekannte Captcha, das allerdings auch häufig den Benutzer abwehrt, weil dessen kryptische Zeichen und Zahlen nicht gut zu entschlüsseln sind. Deshalb möchte ich hier Methoden vorstellen die ohne Captcha auskommen. Die gute Nachricht ist, Spambots haben Schwächen, die wir uns im Folgenden zu nutze machen werden. Dazu wird es offensichtliche und versteckte Methoden geben, die in Kombination einen sehr guten Spamschutz bieten sollten.

HTML MARKUP

Demo Formular

1. Abwehr – Checkbox Schwäche

Die offensichtliche Methode ist die Checkbox am Ende des Formulars, hier bestätigt der Benutzer, dass er es ernst meint. Ältere Spambots  können sehr gut Eingabefelder ausfüllen aber keine Checkboxen aktivieren. Somit hätten wir hier schon die erste Abwehr. Bei der Validierung können wir nun prüfen ob die Checkbox markiert wurde, ist das nicht der Fall, bekommt der reale Benutzer eine Meldung und kann es nachholen, der Spambot allerdings dreht sich im Kreis, weil er die Meldung nicht versteht, das Formular aber ohne Aktivierung nicht abgeschickt werden kann.

Da es sich bei einer Checkbox auch nur um ein HTML Element handelt, können modernere Spambots natürlich auch Checkboxen manipulieren und aktivieren. Das machen wir uns in der nächsten Methode zu nutze, indem wir eine Checkbox platzieren die nicht aktiviert werden darf. Bei der Validierung können wir nun prüfen ob diese Checkbox tatsächlich nicht aktiviert wurde oder ob der fleißige Spambot in seinem Eifer doch den Haken gesetzt hat. Wenn er es hat, wird das Formular nicht abgeschickt werden können.

2. Abwehr – CSS Schwäche

Damit die zweite Checkbox den realen Benutzer nicht verwirrt greifen wir auf eine weitere Schwäche der Spambots zurück. Sie können mit CSS Regeln nichts anfangen, deshalb platzieren wir die zweite Checkbox in einem Container, den wir via CSS Klasse ausblenden.

Wichtig hierbei ist den Container über die Klasse auszublenden. Das Ausblenden durch Inline CSS  <div style=”display:none”>…</div>  oder <input type=”checkbox” style=”display:none”> ist nicht geeignet, da Spammer nicht schlafen solche Angaben bereits auswerten können und das Eingabefeld dann ignorieren. Bei Ausblenden via Klasse müsste der Spambot erst einen Abgleich mit der externen CSS Datei machen, was die Hürde weiter nach oben setzt. Für reale Benutzer die CSS deaktiviert haben oder einen Screen Reader benutzen können wir im ausgeblendeten Container eine Mitteilung hinterlassen die auffordert die Felder frei zu lassen.

3. Abwehr – Honeypot

Als Honeypot bezeichnet man Eingabefelder, die vom realen Benutzer frei gelassen werden, den Spambot aber zum Ausfüllen einladen. Bei der PHP Validierung des Formulars prüfen wir dann, ob das Feld tatsächlich leer ist. Ist es nicht leer, konnte der Spambot dieser Versuchung nicht widerstehen und wir haben  die Möglichkeit ihn auszuschließen. Fügen wir unserem Formular also ein weiteres Eingabefeld hinzu.

Der Name des Eingabefeldes sollte so attraktiv wie möglich sein, denn Spambots lernen ständig dazu und ignorieren gekonnt Eingabefelder die darauf schließen lassen, dass sie der Spamabwehr dienen. Im Beispiel heißt das Feld name=”repeat_email” . Deshalb heißen die Checkboxen oben name=”gender” und  name=”terms” ,vor allem  Terms sind vor dem Absenden immer zu bestätigen, was den Spambot zum aktivieren animiert. Reingefallen! Zurück zum Honeypot, da das Eingabefeld leer bleiben soll, brauchen wir es dem realen Benutzer nicht zeigen. Positionieren wir dieses Eingabefeld also im ausgeblendeten CSS Container und machen uns dabei gleich eine weitere Schwäche von Spambots zu nutze.

4. Abwehr – Javascript Schwäche

Die meisten Spambots crawlen das Web mit deaktivierten Javascript. Also fügen wir das neue Eingabefeld per Javascript ein.

Da auf meinen Websites jQuery  im Einsatz ist,  füge ich das Eingabefeld via jQuery .append() hinzu und positioniere es im ausgeblendeten Container, so dass der reale Benutzer es nicht sieht. Kommt nun ein Spambot mit deaktivierten Javascript vorbei, wird der jQuery Code nicht ausgeführt und das Feld ist für den Spambot nicht sichtbar.

Für Benutzer mit deaktivieren Javascript können wir mit <noscript> eine entsprechende Meldung hinterlassen. An der Stelle frage ich mich, wie wohl das Surferlebnis ohne Javascript heutzutage ausschaut, bei all den modernen Javascript Elementen auf den Websites.

PHP Validierung

Nach der Kür nun die Pflicht. Validieren wir die Eingaben mit PHP.

Zur Überprüfung der Eingaben nutzen wir einfachstes PHP, was nochmal eine Verbesserung der Spamabwehr darstellt, denn wie oben erwähnt sind viele Spambots mit deaktivierten Javascript unterwegs, was Validierung via Javascript völlig wirkungslos macht.

Gehen wir kurz durch den Code. Wenn das Formular abgeschickt ist, setzen wir $spamcheck = false; , prüfen wir nun die versteckten Spamelemente damit diese den Spambot in frühster Phase ausbremsen. Mit  if(!isset($_POST[“repeat_email”]) || !empty($_POST[“repeat_email”]) || isset($_POST[“terms”])) { … }  prüfen wir ob unser via Javascript eingefügtes Feld vorhanden ist, weiter wird geprüft ob die beiden versteckten Felder leer gelassen wurden. Ist eines davon nicht leer, speichern wir eine Fehlervariable. Sind beide Felder leer setzen wir  $spamcheck = true; Wurde der Spamcheck bestanden validieren wir nun die anderen Formulareingaben, unter anderen auch die offensichtlich Checkbox die uns auch zur Spamabwehr dient. if(!isset($_POST[“gender”])){ … } Auftretende Fehler speichern wir wieder im Fehlerarray. Wurden der Spamtest bestanden if(isset($_POST[‘submit’]) && empty($errors) && $spamcheck == true) { … } und es sind keine Validierungsfehler vorhanden, können wir das Formular verarbeiten. Je nach Anwendung entweder mit einem Eintrag in die Datenbank oder halt mit versenden einer Email.

Sorgen wir noch dafür, dass  Benutzer die Fehlermeldungen zu sehen bekommt und positionieren folgenden Code über dem Formular. Hier wandeln wir die Einträge der Fehlervariable in eine Liste um und geben diese aus.

Fazit

Spamabwehr wird auch in Zukunft ein heißes Thema sein. Spam wirksam abwehren bedeutet immer auch Abstriche. Vor allem Abstriche in Hinblick auf Nutzerfreundlichkeit und/oder Barrierefreiheit. Ich habe oben genannte Variante bei einigen Formularen jetzt schon eine Weile erfolgreich im Einsatz. Ich bin gespannt wie lange es dauert, bis ich auch über eines dieser Formulare mit Spam bombardiert werde.

Ich habe ein erweitertes Kontaktformular erstellt, was oben genannte Elemente beinhaltet und zusätzlich auch die restlichen Eingabefelder per PHP validiert. Es ist soweit unformatiert, damit ihr es für eure Bedürfnisse anpassen könnt.

Demo Formular | Download Demo Formular

1 Gedanke zu „PHP Formular Spamschutz und Validierung – Spam Emails verhindern auch ohne Captcha“

Schreibe einen Kommentar zu Anonymous Antworten abbrechen

Share via
Copy link
Powered by Social Snap