Spambots sind blöd
Mittwoch, 22. August 2007
… aber lästig. Sie spammen jedes, aber auch wirklich jedes Formularfeld zu, das sie irgendwo auf irgend einer Seite finden.
Es bleibt also nichts anderes übrig, als jedes Formular, welchem Zweck es auch dient, vor diesen maschinellen Idioten zu schützen.
Ich setze hierzu zwei verschiedene Methoden ein. Beide Methoden vermeiden den größten Nachteil der - leider - weitverbreiteten Captchas: Sie ermöglichen das korrekte Ausfüllen und Abschicken eines Formulars auch dann, wenn der Besucher nicht mit einem Adlerblick gesegnet ist.
Methode 1: Die Rechenaufgabe
Die Seite, die vom Formular aufgerufen wird (das kann auch die absendende Seite sein Stichwort: Affenformular), überprüft serverseitig ob die Rechenaufgabe richtig gelöst wurde.
Falls nein, kann hier nochmals ein Hinweis ausgegeben werden.
Jedenfalls wird das Formular nicht verarbeitet, was ja der Zweck der Sache war.
Methode 2: ein verstecktes, leeres Eingabefeld
Diese Methode macht sich den Umstand zunutze, dass Spambots, wie schon der Titel dieses Beitrags ausdrückt, dumm sind, und jedes Feld eines Formulars ausfüllen.
Der Trick besteht nun darin, ein zusätzliches Feld ins Formular einzufügen, das NICHT ausgefüllt werden darf.
<input class="versteckt" name="email" size="35" type="text" />
Damit menschliche Benutzer hier nichts eintragen, wird das Feld per CSS versteckt. Aber Achtung! Das Feld nicht als type="hidden” auszeichnen, und NICHT mit display:none oder visibility:hidden verstecken. So dumm sind die Bots dann doch nicht.
Richtig ist vielmehr, das Feld per CSS aus dem viewport zu verschieben.
Zum Beispiel mit diesen CSS Anweisungen:
.versteckt {
position:absolute;
left:-1000px;
top:-1000px;
width:0;
height:0;
overflow:hidden;
display:inline;
}
Dann noch ein Hinweis für Besucher, die das CSS nicht interpretieren (zum Beispiel Screenreader), und die das “versteckte” Feld dennoch zu sehen bekommen, dieses Feld nicht auszufüllen. Diese Anmerkung selbst wird natürlich auf die gleiche Weise vor sehenden Benutzern versteckt.
Falls nun das versteckte Feld dennoch ausgefüllt ist, wird die Bearbeitung des Formulars serverseitig verweigert.
Mit PHP könnte dies im einfachsten Fall so aussehen:
if ($_GET["email"] != "") exit;
______________________
Nachtrag 03.11.:
Wenn das so zu schützende Formular bereits länger online war, dann ist die Wahrscheinlichkeit groß. dass Spambots die Informationen über dieses Formular bereits gespeichert haben, und nicht erst die Seite spidern, um die Formulardaten zu sammeln. Sie werden also ihren Spam ohne das “versteckte” Input Feld abschicken, und obige Abfrage funktioniert nicht mehr.
Die PHP Auswertung wird also erweitert:
if (( !isset($_GET["email"])) || $_GET["email"] != “") {
echo ‘
<p>Das Feld nach dem Suchfeld muss leer bleiben, sonst funktioniert die Suche nicht.
<br />Bitte gehen Sie mit der Zurück-Funktion Ihres Browsers zurück zur Suchfunktion.</p>
‘;
exit;
}
Was passiert hier?
Das Feld “email” muss geGETed werden (das aber machen die Spambots mit alten Datenbeständen nicht), aber es muss leer sein (wenn die Seite neu gespidert wird, dann schreiben die Bots hier was rein).
1 Kommentar
Einen Kommentar abgeben
XHTML erlaubt: <a href="" title="" rel=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>
Code-Beispiele
Damit Code-Beispiele richtig angezeigt werden, müssen Sonderzeichen maskiert werden (z.B. < zu <).

Deine Aussage:
Aber Achtung! Das Feld nicht als type="hidden” auszeichnen, und NICHT mit display:none oder visibility:hidden verstecken. So dumm sind die Bots dann doch nicht.
Richtig ist vielmehr, das Feld per CSS aus dem viewport zu verschieben.
Mein Kommentar:
Wenn der Bot CSS liest (um dort “hidden” zu erkennen), wird er auch sehr schnell erkennen, dass ein Feld ‘hinausgeschoben’ wurde - oder etwa nicht?
Kommentar von D. Venske — Mittwoch, 5. Dezember 2007 - 11:31 Uhr