Methoden zur Spamvermeidung

2 | 7399 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.