Webtechnik

Spam Bots verstehen und bekämpfen

Tags:Spam Bot - Captcha - hidden - Formular
spam_botsIn den Kommentaren zu meinem Artikel über CAPTCHAS kam besonders ein interessantes Mittel als Alternative zu den Captchas auf. Versteckte Formularfelder richtig eingesetzt, ersetzen Captchas. Bei mir keimte dann ein Interesse auf, wie die nervigen Spam Bots eigentlich wirklich vorgehen und ob und warum sie versteckte Formularfelder ausfüllen. Wenn man das Verhaltensmuster der Bots kennt, kann man sie effektiver bekämpfen und außerdem die Wirksamkeit der Methode abschätzen. In diesem Artikel geht es nur um die Formular Spammer, andere Spamarten werden nicht behandelt.



Spam Bots sind dumm

Im Kampf gegen die Bots sollte man sich immer einen Satz gut merken. Bots sind dumm aber nicht dämlich. Sie suchen nach ganz bestimmten Mustern, die ein Mensch festgelegt hat. Primär ist dabei die Suche nach Feldern, die ausgefüllt werden müssen. Felder vom Typ hidden werden darum meistens ausgelassen, da dem Bot beigebracht wurde, dass ein verstecktes Feld nicht von Belang für den Ausfüller ist und übergangen werden soll.
Der Bot prüft also, ob ein type="hidden" im Formularfeld-Tag vorkommt. Falls ja, übergeht er das Feld und füllt es nicht aus. Ebenso suchen schon einige Bots nach CSS Anweisungen wie style="display:none" oder style="visibility:hidden". Darum fallen sämtliche herkömmliche Methoden das Feld zu verstecken, aus der Liste der Möglichkeiten. Es muss also eine Lösung her das Feld für Menschen zu verstecken, aber dennoch von Bots ausfüllen zu lassen.

Einen Bot zu programmieren, der nach den oben genannten Mustern suchen, ist eine leichte Übung. Allerdings können die wenigsten Bots CSS verstehen. Noch sicherer ist es, wenn man die CSS Anweisungen außerdem in ein externes Stylesheet schreibt. Diese auszulesen stellt einen viel größeren Programmieraufwand dar. Also definiert man eine Klasse für das zu versteckenden Feld, oder besser noch: Man packt das Feld in einem Paragraph (<p></p>) oder in eine Ebene (<div></div>) und weist dieser eine Klasse zu. Der Name der Klasse kann frei gewählt werden, sollte doch nicht unbedingt spam oder ähnlich lauten, da der Bot vielleicht auf diese Schlagwörter reagiert. Im schlimmsten Fall, erkennt er den Trick.
Ich war ganz kreativ und habe bei einem Formular die Klasse einfach Schinken genannt. Zunge rausstrecken

Für diese Klasse wird dann im Stylesheet folgendes definiert: display:none;
Alternativ dazu, kann das Formularfeld auch aus dem Bildschirmbereich geschoben werden. Hier würde die CSS Anweisung lauten: margin-left:-3000px;.
Für Menschen, die Browser ohne CSS benutzen, sollte in der gleichen Ebene oder im gleichen Paragraph ein Hinweis enthalten sein, der ihnen mitteilt, dass das nachfolgende Feld nicht auszufüllen ist. Der Hinweis wird natürlich für die CSS Leute auf gleiche Weise wie das Formularfeld versteckt.
Damit sollte einiges an Usability und Barrierefreiheit gegeben sein.

Der Name des Feldes (name="") sollte bewusst gewählt werden. Bots wollen URLs bewerben und verbreiten. Welcher Name bietet sich also besser an, als url? In dieses Feld wird der Bot mit großer Sicherheit die zu bewerbende URL eintragen.
Der Name email oder mail kann ebenso genutzt werden, da normalerweise in jedem Formular nach einer Absenderadresse gefragt wird. Der Bot trägt hier dann eine fake Email ein.

Das Codebeispiel

Zum besseren Verständnis habe ich jetzt noch ein Anwendungsbeispiel vorbereitet. Die Codezeilen stammen aus meinem eigenen Kontaktformular.

<form id="kontakt" name="kontakt" method="post" action="" >

...Forumlarfelder...

<p class="schinken">
 Das nachfolgende Feld muss leer bleiben:
 <input name="url" id="url" class="form_input" title="dieses Feld muss leer bleiben" type="text" />
</p>

... ggf. Weitere Felder ...

</form>

Der dazugehörige CSS Code:
.schinken {
 display:none;
}

Und der php Teil:
//Ist das Feld für den Spamschutz leer? Wenn nein, führe if aus!
 if (!empty($_POST['url'])){
 
 $error = true;
 $errormsg .= "Um das Formular zu senden, muss das Spamschutzfeld leer bleiben.<br />\n";
 }

Ich hoffe es wurde etwas klarer, wie die Bots arbeiten und wie man mit versteckten Formularfeldern prüfen kann, ob das Formular von einem Spam Bot ausgefüllt worden ist.
Viel Spaß mit dieser, meiner Meinung nach, besseren Überprüfung. Ich werde die Methode jedenfalls ausgiebig testen und ggf. in kommenden Projekten einsetzen.

RSSfeed Dieser Artikel hat dir gefallen? Abonniere neue Beiträge im Webszenario RSS-Feed.
Danke fürs Lesen dieses Beitrags. Ich würde mich besonders freuen, wenn du zu meinen Followern auf Twitter stoßen würdest oder mir ein Kommentar hinterlässt.
Favorites Twitter Facebook Myspace Stumbleupon Digg delicious MR. Wong Technorati google reddit Yahoo



Kommentare  

 
# Manuel 06.02.2012 | 08:54
Schnell auf ein aktuelles Thema in deinem Blog reagiert. Spricht sehr für den Blog wenn die Stimmen der Nutzer in dieser Weise die großen Themen mitlenken können.
Für die kurze Zeit auch ausgesprochen gut recherchiert und erklärt.
 
 
# Mario 06.02.2012 | 08:54
Danke für die Blumen ;) Das hört man doch gerne.
 
 
# T. Hinze 06.02.2012 | 08:54
Ich stimme Manuel zu: schnell auf Comments der eigenen Beiträge reagiert.

Dabei haben sich einige Schwächen eingeschlichen.

1) Bei den Styles:
* sollte display: none; reichen
* sollte das margin-left: -3000px heißen (also mit Minus) um Scrollbalkeneffekte zu verhindern

2) Wahl der Beschriftung
Du hast die Klasse schinken gewählt, schreibst aber in das Feld selbst den Begriff Spamschutz. Das ist sicher widersetzlich. Die Kommentare würde ich von Spam & Co. freihalten. Im Fehlertext darf er dann gern autauchen.

Ok - ich selbst hatte mir beim lesen der Überschrift außerdem noch 1-2 Beispiele für Bots gewünscht. Aber das führe ich hier nicht als Kritik an, denn ich weiß nicht, ob man die Dinger so einfach sich beschaffen/verstehen kann.

Also -> gut gemacht!

PS:
Wie wäre es diese neue Erkenntniss hier in der Komment-Funktion schon anzuwenden? ;-P

Gruß
Torsten
 
 
# Mario 06.02.2012 | 08:54
Hey, danke für dein Kommentar. Das Minus hatte ich doch tatsächlich vergessen. Beim Korrekturlesen fällt mir das meistens nicht auf. Daher freue ich mich über die Infos immer.

Bei der Beschrifung gebe ich dir recht. Das habe ich auch gleich aus dem Beitrag genommen.

Bezüglich der Beispielbots: Ich habe 2 Stunden bei Google intensivst gesucht, aber ohne Ergbnis. Selbst die Infos, wie ein Bot vorgeht, kommen von bestimmt 7-8 verschiedenen Quellen.
Hier ist im Internet auf jeden Fall ein Contentloch ;)

Bei der Kommentarfunktion handelt es sich um eine Joomla Extension. Ich habe diese nur übernommen und angepasst, nicht selbst geschrieben. Darum werde ich mich in einer ruhigen Stunde mal hinsetzen und sehen, ob ich den Code verstehe und ohne Captcha umschreiben kann.
 
 
# Ohrflieger 06.02.2012 | 08:54
Schöner Artikel. Und den Kommentar im vorhergehenden Artikel gut ausgebaut ;)

Das display: none; könnte vielleicht sogar weggelassen werden, wenn das Feld durch das margin: left: -3000px; sowieso aus dem Sichtbereich verschwindet. Dann reagieren Bots, die CSS verstehen, eventuell anders auf das Feld.

Zitat:
Bezüglich der Beispielbots: Ich habe 2 Stunden bei Google intensivst gesucht, aber ohne Ergbnis. Selbst die Infos, wie ein Bot vorgeht, kommen von bestimmt 7-8 verschiedenen Quellen. Hier ist im Internet auf jeden Fall ein Contentloch ;)


Vielleicht liegt das daran, dass die Bots teilweise sehr unterschiedlich vorgehen und dazu noch ständig weiterentwickelt werden. Außerdem geben Entwickler von Spambots ihr Wissen nicht gerne preis ;)
 

Kommentar schreiben


Sicherheitscode
Aktualisieren