Methoden zur Spamvermeidung

2 | 10 Kommentare | 6985 Aufrufe
Sie können diese Wikiseite nach der Anmeldung auf Webmasterpro bearbeiten. Helfen Sie mit und verbessern Sie "Methoden zur Spamvermeidung" mit Ihrem Wissen!

Anzeige Hier werben

Gerade bei selbstentwickelten Anwendungen bekommt man spätestens beim längeren Einsatz zu spüren, dass der gut gemeinte schlanke Code nicht alle Aufgaben erfüllt, die es zu erfüllen gilt. Nachfolgend möchte ich ein wenig auf Möglichkeiten eingehen durch Robots und Besucher generiertem Spam vorzubeugen.

Bevor ich damit beginne aber noch ein kurzes Vorwort. Eine perfekte Lösung, eine Art Patentrezept, gibt es leider nicht. Es gilt die Einsatzzwecke und Ziele zu analysieren und anschließend die beste Kombination aus mehreren Methoden zu wählen um einen möglichst hohen Schutz zu erreichen.

Bei der Entwicklung von Methoden zur Spamvermeidung gilt es die Unterschiede zwischen wertvollen und überflüssigen Beiträgen zu definieren.

Bereich
wertvolle Beiträge
Spambeiträge
Author
Mensch
Robots, evtl. Mensch (Spammer)
Formularanalyse
visuell
Quelltext
Inhalte
wertvoll, sinnvoll
häufig Englisch, leicht identifizierbar
Aktivität
eher selten aktiv
übertrieben häufig aktiv

Honeypot: Formular

Der Unterschied im Analyseverhalten des Formulars zwischen Mensch und Robot kann für die Spamvermeidung effektiv ausgenutzt werden. Bösartige Robots suchen gezielt nach Eingabefeldern in welche sie Ihre Werbung, meist für Internetseiten, unterbringen können. Dieses Verhalten gilt es sich zu Nutze zu machen.

Strategie

Man füge dem Formular ein zusätzliches Eingabefeld hinzu und versteckt dieses anschließend mithilfe einer CSS Klasse. Ist das Feld nach dem Absenden ausgefüllt, handelt es sich höchstwahrscheinlich um einen Spamangriff. Entscheidend sind zwei Dinge:

  1. Das Formularfeld braucht einen provokanten Namen wie wwwebsite oder website_url, damit die Spambots geradezu genötigt werden es zu füllen.
  2. Das ausblenden via CSS Klasse darf nicht über die Methoden display:none; oder visibility:hidden; geschehen.
Formular  
HTML
1
2
3
4
5
6
<form>
<fieldset>
<input class="wwwebsite" type="text" name="wwwebsite" value="" />
<!-- weitere Eingabefelder ... -->
</fieldset>
</form> 
PHP  
PHP
1
2
3
4
<?php
if (!empty($_POST['wwwebsite']))
    /* evtl relevante Daten des Robots speichern und Fehlermeldung ausgeben */
?>
CSS Klasse  
css
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
.wwwebsite {
    z-index:999;
    position:absolute;
    height:0;
    width:0;
    border:none;
    background:none;
    margin:0;
    top:0;
    left:0;
    clear:both;
    font-size:0px;
    line-height:0px;
}

Fazit

Unter Umständen kann diese Methode ein Usabilityproblem darstellen. Füllt ein Besucher das Formular via TAB aus und springt durch alle Formularfelder, könnte er versehentlich den Honigtopf mit Inhalt füllen. Für diesen Fall sollte man eine entsprechende Fehlermeldung ausgeben und natürlich die Formulardaten zur direkten Wiederverwendung zwischenspeichern.

Robots identifizieren

Füllt ein Robot ein Eingabeformular zu Erstellung eines neuen Kommentars aus, kann dies nicht erwünscht sein. Einfache Abhilfe sollte die Identifikation des Besuchers schaffen. Dazu kann in PHP der User Agent via $_SERVER['HTTP_USER_AGENT'] ausgelesen werden. In dieser Stringvariable sind Informationen über Browser, Betriebssystem, Versionen und Herkunft/Sprache des Benutzers gespeichert.

Strategie

Nachdem ein Formular gesendet wurde, wird der User Agent mithilfe eines Suchmusters nach verdächtigen Merkmalen gescannt. Bei positivem Ergebnis handelt es sich vermutlich um einen Robot und die Verarbeitung wird mit einer Fehlermeldung abgebrochen.

Suchmuster  
PHP
1
2
3
4
5
<?php
$pt = '#w3c|google|slurp|msn|yahoo|y!j|altavista|ask|spider|search|bot|crawl|usw#i';
if (preg_match($pt))
    /* Fehlermeldung & evtl. Möglichkeit das Formular trotzdem zu verarbeiten */
?>

Fazit

Problem an dieser Methode ist, dass der User Agent manipulierbar ist. Es ist also davon auszugehen, dass bösartige Robots sich tarnen und ihr Vorhaben verschleiern. Diese Methode kann also nur eine Ergänzung zu anderen Methoden sein.
Weitergehend ist es natürlich möglich, dass das verwendete Suchmuster zukünftig auf neuere Browserversionen anschlägt und somit ungewollt echte, gute Besucher aussperrt. Das Suchmuster ist also sehr genau und sehr sorgsam zu aktualisieren und zu prüfen.

Honeypot: robots.txt

Jeder guter Webmaster kennt sie und verwendet sie (hoffentlich). Mithilfe der robots.txt lassen sich Verzeichnisse und Dateien sozusagen als Sperrzone definieren - sie dürfen also nicht von Robots besucht werden. Während der Googlebot und ähnliche gutartige Bots sich natürlich daran halten, neigen bösartige Bots wie eMail-Sammler und Spammer dazu, gerade diese Seiten und Verzeichnisse zu durchforsten. Wieso sollte man sich dieses Fehlverhalten nicht zu nutze machen?

Strategie

Man verbietet den Robots gezielt den Besuch auf eine Datei namens identify.php. Besucht jemand diese Datei werden Zeitpunkt, User Agent und IP-Adresse des Besuchers gespeichert und die Falle schnappt zu. Die Daten können anschließend entweder automatisch mithilfe der .htaccess Dateien dazu dienen den Besucher komplett auszusperren, oder das Suchmuster für die Identifikation von Robots zu verfeinern.

robots.txt  
Text
1
2
User-agent: *
Disallow: /identify.php
identify.php  
PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<?php
error_reporting(0);
$file = $_SERVER['DOCUMENT_ROOT'].'robots.html';
$str = '<br>'.date("d-m-Y_H-i",time())
    .'<br>'.$_SERVER['HTTP_USER_AGENT']
    .'<br>'.getenv("REMOTE_ADDR").'<br>';
$handle = fopen($file,'a+');
fwrite($handle,$str);
fclose($handle);

/* evtl. weitere Aktionen wie Bearbeitung der .htaccess Datei */
?>

Fazit

Eine hervorragende, ressourcenschonende Methode um bösartige Robots zu bestrafen. Es ist aber leider nicht zu erwarten, dass tatsächlich alle bösartigen Robots sich die Mühe machen die robots.txt Datei analysieren oder die PHP Datei zu besuchen.

Spam identifizieren

Das stärkste Merkmal von Spam ist der Inhalt. Würden Spambots wertvolle Beiträge liefern, müssten wir uns nicht mit der Spamvermeidung auseinander setzen. Wieso versuchen wir also nicht einfach anhand der Inhalte Spam zu identifizieren und die Verarbeitung zu stoppen?

Strategie

Nachdem ein Formular abgesendet wird, scannt ein Suchmuster das Textareafeld nach eindeutigen und für Spam typischen Wörtern und Wortkombinationen. Haben wir eine bestimmte Mindestanzahl von Treffern, ist zumindest zu vermuten, dass es sich um einen Spamangriff handeln könnte.

Suchmuster  
PHP
1
2
3
4
5
6
<?php
$pt='#(hhfgdgdf|Darlehen|Kredit|financing|auction|cheap|hotel|car|wrestling|affordable|direct|casino|poker|Aufstellungsort|thank you|Nice site|...)#i';

if (!empty($_POST['str']) && 3 < preg_match_all($pt,$_POST['str']))
    echo preg_replace($pt,'(SPAM)<ins>\\1</ins>(SPAM)',$_POST['str']);
?>

Fazit

Neben der Tatsache, dass diese Methode je nach Suchmuster und Traffic nicht gerade ressourcenschonend ist, kann es auch vorkommen, dass wertvolle Beiträge abgefangen werden. Für diesen Fall sollte man dem Benutzer die Möglichkeit geben seine Eingabe zu korrigieren.

Zeitsperre

Das Problem an Spambots und Spammern ist vor Allem die hohe Aktivität in einem kurzen Zeitraum. Spambots sind nur deshalb so effektiv, da Sie in der Lage sind Unmengen an Datenmüll innerhalb kürzester Zeit zu fabrizieren. Normale Besucher dagegen brauchen nicht nur einige Zeit um einen Eintrag zu erstellen, sondern erstellen selten innerhalb einer Minute gleich mehrere Einträge.

Strategie A

Bei Aufruf des Formulars wird der aktuelle Zeitstempel in einer Sessionvariable gespeichert. Nach dem Absenden des Formulars wird der Zeitstempel aus der Session mit dem aktuellen Zeitstempel verglichen. Ist eine gewisse Differenz, von z.B. 15 Sekunden, unterschritten, ist davon auszugehen, dass es sich um einen Spamangriff handelt.

PHP Prüfung  
PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<?php
# Aufruf des Formulars
$_SESSION['spamprotect_time'] = time();
?>
...
...
...
<?php
# Verarbeitung des Formulars
$diff = time() - $_SESSION['spamprotect_time'];
if (15 > $diff)
    /* Fehlermeldung ausgeben */
?>

Fazit A

Diese Methode wird häufig in großen Communities und Foren recht erfolgreich eingesetzt um menschlichen Spammern Einhalt zu gebieten. Für diesen Einsatzbereich ist diese Methode auch gedacht. In wie weit Spambots sich davon abschrecken lassen, ist schwer zu sagen, da viele Robots inzwischen von Seite zu Seite springen und nur einzelne Einträge zurücklassen.

Strategie B

Nachdem ein Formular erfolgreich verarbeitet wurde, wird der aktuelle Zeitstempel sowie ein interner Zähler in einer Session gespeichert. Sobald ein zweites Formular verarbeitet werden soll, wird sowohl Zeitstempel als auch der Zähler geprüft. Ist das Verhältnis von Differenz und Zähler verdächtig, wird die Verarbeitung abgebrochen.

PHP Prüfung  
PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<?php
# Verarbeitung des ersten Formulars
$_SESSION['spamprotect_time']=time();
$_SESSION['spamprotect_count']=1;
?>
...
...
...
<?php
# vor d. Verarbeitung der zweiten Formulars
$diff = time() - $_SESSION['spamprotect_time'];
$_SESSION['spamprotect_count']++;
$count = $_SESSION['spamprotect_count'];
if(($diff / count) < 30)
    /* Fehlermeldung, da die Dauer pro Eintrag kleiner als 30s ist */
?>

Fazit B

Ebenfalls eine sehr effektive Methode um menschlichen Spammern in Communities und Foren einen Dämpfer zu geben. Diese Methode ist gegenüber der Strategie A in sofern im Vorteil, da mit einem Durchschnittswert bestimmt wird, ob es sich um einen Spammer handelt, oder nicht.

Aufgabe & Lösung

Eine beliebte Methode um Spambots das Leben schwer zu machen ist, das Stellen einer Aufgabe, die von Menschen sehr einfach und schnell lösbar ist, den Bot aber meist daran hindert das Formular korrekt auszufüllen.

Strategie

Dem normalem Formular fügt man ein weiteres Eingabefeld für die Lösung der Aufgabe hinzu. Via PHP lässt man eine zufällige Aufgabe generieren, dessen Lösung man in einer Session zwischenspeichert. Nun gibt man dem Benutzer das Formular samt Aufgabe & Lösungsfeld zum ausfüllen. Anschließend prüft man ob die Lösung des Benutzers korrekt ist.

Aufgabe generieren  
PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<?php
$aufg=array(
    array('Zwölf plus Zwei',14),
    array('Zehn minus Fünf',5),
    array('Vierzehn geteilt durch Zwei',7)
);
$max = count($aufg) - 1;
$i = rand(0, $max);
$aufgabe = $aufg[$i][0];
$result = $aufg[$i][1];
$_SESSION['result'] = $result;
?>
Formular  
HTML
1
2
3
4
5
6
<form>
<fieldset>
<input type="text" name="result" value="" /> <?=$result;?>
<!-- weitere Eingabefelder ... -->
</fieldset>
</form>
Lösung prüfen  
PHP
1
2
3
4
<?php
if (empty($_POST['result']) or (!empty($_POST['result']) && $_POST['result']!=$_SESSION['result']))
    /* Fehlermeldung */
?>

Fazit

Diese Methode ist sehr effektiv und auch ressourcenschonend. Man muss allerdings bedenken, dass die Benutzerfreundlichkeit dadurch stark beeinflusst wird. Man muss sich die Frage stellen, ob diese Einschränkung der Benutzerfreundlichkeit wirklich notwendig ist, oder ob man das gleiche Ziel auch mit anderen Methoden erreichen kann.

Captchas

CAPTCHA ( Completely Automated Public Turing test to tell Computers and Humans Apart ) ist ein Verfahren, das vorrangig auf Webseiten eingesetzt wird, um (Spam-)Bots von Menschen unterscheiden zu können. Die am häufigsten eingesetzte Variante ist eine Zeichenfolge, die in ein Bild eingebettet ist. Diese muss der Betrachter abtippen und kann somit beweisen, dass er keine Maschine ist.

Strategie

Ähnlich der Methode Aufgabe & Lösung wird mit dem Formular ein Bild via PHP generiert, die Lösung des Bildes als Sessionvariable zwischengespeichert und anschließend die Formulareingabe mit der Sessionvariable verglichen. Die Komplexität eines solchen Scripts ist im Vergleich zu anderen Methoden enorm, weshalb Entwickler bereits einige Fertiglösungen geschrieben haben.

Fazit

Captchas waren zu Beginn recht effektiv, werden aber in letzter Zeit immer häufiger von Anbietern aktualisiert, was darauf schließen lässt, dass es Probleme zu geben scheint. Ein weiteres Problem stellt die Benutzerfreundlichkeit und Barrierefreiheit dar. Manche Captchas sind sogar für gesunde Menschen schwer zu entziffern, wie sollen Sehbehinderte Menschen dann erst diese Hürde überwinden.

Obfuscation

Als Obfuscation im herkömmlichen Sinne bezeichnet man das gezielte Erschweren von Reverse Engineering. Dabei wird der bestehende Code, unter Beibehaltung von Funktion und bestenfalls Geschwindigkeit, so verändert, dass ein Mensch kaum mehr in der Lage ist den Code zu lesen. (In gewisser Weise handelt es sich um die gegensätzliche Idee zu Refactorings.)

Strategie

Das Verfahren kann man aber auch zur Spamvermeidung bei mailto-Links einsetzen. Eine eMail-Adresse wird im Quellcode so zerlegt, dass der Browser weiterhin die korrekte Adresse oder den Link zeigt, aber im Quellcode die Adresse kaum mehr aufzufinden ist. Herkömmliche RegExp-Suchen laufen so ins Leere.

SpamSpan beispielsweise benutzt JavaScript und verschachtelte SPANs. Selbst wenn kein JavaScript im Browser aktiviert is, wird in allen herkömmlichen Browsern die Adresse noch korrekt dargestellt - mit aktiviertem JavaScript dann auch als Link. Verschiedene Paranoia-Level lassen sich bei der Generierung auf der Webseite wählen.

Fazit

Es besteht jederzeit die Gefahr, dass ein Browser die Adresse nicht lesbar darstellt und eine Kontaktaufnahme unmöglich macht. Verfahren wie SpamSpan sind bei größerer Verbreitung natürlich auch den Spammern bekannt und lassen sich dann leicht aushebeln.

Entwicklung weiterer Methoden und Nachwort

Wie zu Beginn bereits erwähnt, gilt es bei der Neuentwicklung von Methoden zur Spamvermeidung die Unterschiede in den Verhaltensweisen und Inhalten zu definieren und auszunutzen. Zu Bedenken ist dabei leider, dass es nicht nur Robots sind, die unerwünschte Einträge verfassen, sondern auch Menschen um sich beispielsweise im Suchmaschinenranking nach vorne zu katapultieren. Teilweise auch sehr erfolgreich.

Weitergehend ist darauf zu achten, für welchen Zweck die Methode eingesetzt werden soll und welche Kombination mehrerer Methoden am sinnvollsten ist.

Ich hoffe ich habe die Strategien verständlich erklärt und konnte dem ein oder anderen die Thematik ein wenig näher bringen.


Wikiseite bearbeiten

Diese Seite kann von jedem registrierten Benutzer bearbeitet werden. Bisher haben 5 Personen an der Seite "Methoden zur Spamvermeidung" mitgewirkt.

Sie haben einen Fehler entdeckt oder möchten etwas ergänzen? Dann können Sie nach der Anmeldung "Methoden zur Spamvermeidung" hier bearbeiten.

Mitarbeiter
  • hat keine Beschreibung angegeben. Eine Beschreibung kann man unter dem Punkt "Profil bearbeiten" im Kontrollzentrum eintragen.
  • Ich beschäftige mich seit mehreren Jahren mit Webdesign und ins besondere mit Webentwicklung. Derzeit studiere ich Angewandte Informatik.
  • David Danier arbeitet seit mehr als neun Jahren im Bereich Web Programmierung und ist unter anderem Geschäftsführer der Webagentur Team23 sowie Webmasterpro.de.
  • hat keine Beschreibung angegeben. Eine Beschreibung kann man unter dem Punkt "Profil bearbeiten" im Kontrollzentrum eintragen.
  • hat keine Beschreibung angegeben. Eine Beschreibung kann man unter dem Punkt "Profil bearbeiten" im Kontrollzentrum eintragen.

Kommentare: Methoden zur Spamvermeidung

Neuen Kommentar schreiben
Zur Obfuscation
Beantworten

Heute habe ich was auf der Webseite meines IT'Lehrers entdeckt ...

Er hat es sich ganze einfach gemacht, indem er die Kontakt Emailaddresse per mailto: verlinkt hatte und einfach mit nicht zugelassenen Zeichen 'verseucht' hat ...

Im Ganzen sah das dann ungefähr so aus: href="mailto:(antispam#)dierichtige@addres.se" ...

Ich hab keine Ahnung ob das etwas nützt ... was denkt ihr?

Benutzer gelöscht am 11.08.2008 um 20:36
Re: Zur Obfuscation
Beantworten

Das sind alles nur Verfahren die eine Zeit lang nutzen. Irgendwann checken die Bots dann sowas auch.

Fabian Ziegler am 12.08.2008 um 09:41
Re: Zur Obfuscation
Beantworten

das stimmt natürlich aber es gibt tatsächlich momentan sehr einfache verfahren mit denen man das auslesen bzw. erkennen von emails erschweren kann. kürzlich auf dr web gelesen - leider link verlegt:

erfolgreichste methode eines 1 jährigen tests war unter anderem das ändern der schreibrichtung wie span-tag. man gibt also die email-adresse nicht left to right an, oder right o left und dreht die schreibrichtung anschließend damit der user die adresse korrekt lesen kann.

auch die ascii kodierung ist noch recht erfolgreich. eine kombination ist wohl der ratsamste weg um bots noch lange zeit damit zu umgehen.

Benutzer gelöscht am 12.08.2008 um 10:09
Re: Zur Obfuscation
Beantworten

Du kannst auch ein Bild verwenden.

Fabian Ziegler am 12.08.2008 um 10:33
Re: Zur Obfuscation
Beantworten

was natürlich das benutzerfreundliche copy-pasting enorm erschwert, wie das bei der ltr rtl span version ist, habe ich noch nicht getestet. aber zumindest die ascii kodierung lässt sich problem kopieren und hindert den großteil der bots am auslesen der adresse.

Benutzer gelöscht am 12.08.2008 um 23:36
Zusammenführung
Holger V am 02.08.2008 um 19:15
Re: Zusammenführung
Beantworten

gerne kann man die verbinden - habe diesen eintrag über die suche nach "spam" leider nicht gefunden - nur forum-eintrage. werden den beitrag gleich überarbeiten und vorallem den captchas abschnitt mit einbinden.

Benutzer gelöscht am 02.08.2008 um 19:27
Re: Zusammenführung
Beantworten

ist noch nicht veröffentlicht, weil der auch nicht fertig ist/war. Daher wirst du den nicht gefunden haben.

Holger V am 02.08.2008 um 19:35
Re: Zusammenführung
Beantworten

Habe den Captchas teil jetzt eingefügt. Kannst ja gerne noch mit überarbeiten wenn du Lust hast.

Benutzer gelöscht am 02.08.2008 um 19:47
Super Artikel
Beantworten

Vorallem der Part mit den robots.txt ist mir neu und klingt auf jeden Fall sehr effektiv. :)

Benutzer gelöscht am 02.08.2008 um 18:57