Kommentar-Spam verhindernWeblog ohne Spam
Spam-Plage
Kommentar-Spam verhindern
Spammer nutzen jede Chance, ihre unerwünschten Werbebotschaften unters Volk zu bringen. Wer interaktive Web-Angebote programmiert, kann ein Lied davon singen. Besonders gerne legen die Skripts der Spammer in Wikis, Gästebüchern und Blogs Links auf kommerzielle Pornoseiten ab. Das dient zum einen dazu, unbedarfte Benutzer direkt auf die zwielichtigen Angebote zu locken. Zum anderen sollen die vielen Links vortäuschen, dass die beworbene Seite besonders wichtig wäre. Denn seit Google das Page-Ranking auf der Basis der Verlinkung erfunden hat, gilt die Anzahl der Verweise zu einer Seite als Top-Kriterium für deren Qualität.
Um ihr Tun zu verschleiern, verlinken manche Spammer auch ganz unterschiedliche Adressen in den Gästebüchern. Wer sich die Mühe macht, die Links zu überprüfen, stellt dann aber fest, dass jede Adresse doch wieder auf ein und dasselbe Angebot weiterleitet.
Es gibt verschiedene Möglichkeiten, Webspam zu bekämpfen: Stoppuhren, IP-Blocker, Captchas und Skript-Variationen sind die nahe liegenden Gegenmittel. Das Mittel der Wahl sollte ehrliche Benutzer nicht behindern, Spammer aber möglichst sicher ausschließen.
Abwehrkräfte
Kommentar-Spam verhindern
IP-Blocker sind wenig sinnvoll, scheitern sie doch bereits an Proxy-Servern. Sobald mehrere Benutzer hinter dem gleichen Proxy sitzen, ist der IP-Blocker ausgetrickst, denn er sieht nur die IP-Adresse des Proxys. Blockiert er die Adresse, weil anscheinend ein User über die Stränge schlägt, sperrt er damit möglicherweise gleich eine ganze Reihe ernsthaft interessierter Benutzer aus.
Captchas nennt man verfremdete Zeichenfolgen, die in Grafiken eingebettet sind. Computer sind nicht in der Lage, diese Zeichen zu erkennen, Menschen können sie aber problemlos lesen. In interaktiven Formularen stellen Captchas sicher, dass nur Menschen das Formular vollständig ausfüllen können. Nur wenn die Zeichenfolge des Captchas korrekt eingegeben wird, akzeptiert der Server das Formular. Captchas stellen aber auf jeden Fall eine Hürde dar. In Anwendungen, bei denen es auf die Spontaneität der Benutzer ankommt, sollte man daher auf Captchas verzichten. Wikis, Gästebücher und Blogs leben davon, dass man schnell und unkompliziert mitmachen kann. Captchas können vielen Benutzern den Spaß daran verderben. Zudem sind die üblichen grafischen Captchas nicht barrierefrei. Sie stellen ein unüberwindbares Hindernis für Blinde und Sehbehinderte dar.
Zudem hat sich gezeigt, dass Captchas für clevere Spammer keineswegs ein Hindernis sind. Sobald ein Captcha auftaucht, reicht das Spam-Skript es weiter und zeigt es im Login-Dialog einer gut frequentierten Porno-Seite an. Der User dort tippt die Lösung, der Spam-Bot übernimmt sie und hat Zugang zum Captcha-geschützten Formular. Das ist zwar aufwendig, aber je nach Umsatz lohnt sich auch diese Methode für Spammer.
Hand und Fuß
Kommentar-Spam verhindern
Vielleicht reichen aber auch einfachere Gegenmittel. Nicht jedes Gästebuch steht auf der Abschussliste der Spammer ganz oben. Barrierefrei sind Text-Captchas. Das sind zwar keine richtigen Captchas, weil diese vollautomatisch funktionieren, aber dafür sind sie einfach zu implementieren.
Denken Sie sich ein paar einfache Fragen aus, die ein Mensch sehr leicht beantworten kann, ein Computer aber nicht. Zum Beispiel:
– Wie heißt das Körperteil am Ende Ihres Armes? Hand.
– Wie heißt das Körperteil am Ende Ihres Beines? Fuß.
– Welche Farbe hat der wolkenlose Himmel am Tag? Blau.
Achten Sie darauf, dass die Antworten eindeutig sind. Nur wenn der Benutzer die richtige Antwort eingibt, wird sein Beitrag veröffentlicht. Solche Pseudo-Captchas bietet zwar nur relativ geringen Schutz, aber in vielen Fällen reicht das schon aus. Denn oft lohnt es sich für Spammer nicht, jedes einzelne Gästebuch zu knacken. Ihre Skripts sind darauf aus, mit wenig Aufwand möglichst viel Reklamepest zu verbreiten. Noch einfacher ist es, ein Ankreuz-Feld einzubauen, mit dem der Benutzer bestätigt, dass sein Beitrag keine Werbung ist. Das funktioniert zwar nur so lange, bis die Spammer das Ankreuz-Feld gefunden und in ihr Skript eingearbeitet haben, aber mit etwas Glück reicht diese Maßnahme schon aus. Vor allem, wenn jeder Webmaster eine andere Variante dieser Abwehr einbaut, wird es für die Spammer schnell zu aufwendig. Seien Sie kreativ.
Geheimpfand
Kommentar-Spam verhindern
Eine andere Möglichkeit, Spam-Skripts zu irritieren, besteht darin, Standard-Pfade, Dateinamen und Bezeichnungen im Gästebuch, Forum oder Blog zu ändern. Solche Skript-Variationen erscheinen zunächst einfach, können sich aber in der Praxis als Sisyphus-Arbeit erweisen. Denn interaktive Web-Angebote sind unter der Motorhaube meist deutlich komplizierter, als sie von außen aussehen. Eine einzelne Bezeichnung kann an dutzenden oder gar hunderten verschiedenen Stellen im Skript referenziert werden. Jede einzelne Stelle muss angepasst werden. Und nach dem nächsten Update muss die Prozedur wiederholt werden.
Sie tippen zu schnell
Kommentar-Spam verhindern
Die beste Abwehr gegen Blog-Spam sind zurzeit Stoppuhren. Wer einen Kommentar schreibt, braucht dafür meist länger als drei Sekunden. Spam-Skripts dagegen füllen Formulare in Sekundenbruchteilen aus. Der Kommentar wird also nur akzeptiert, wenn zwischen dem Laden des Formulars und dem Abschicken des fertigen Eintrags eine gewisse Mindestzeit liegt.
Im Folgenden erfahren Sie, wie Sie mit Hilfe einer Timer-Funktion Spam verhindern. Damit Sie den Spamschutz nicht zwischen hunderten Code-Zeilen suchen müssen, haben die Autoren ein extrem simples Gästebuch-Skript geschrieben. Das Skript nimmt lediglich einen Text entgegen, fügt ihn am Ende einer Datei ein und zeigt diese an.
Spammen Sie doch mal
Kommentar-Spam verhindern
In seiner Grundform ist dieses Skript ein gefundenes Fressen für Spam-Bots. Man kann beliebig viel und beliebig schnell eintragen. Wenn in der Datei php.ini die Option magic_quotes_gpc auf Off geschaltet ist, können Spammer sogar klickbare Hyperlinks posten. Die PHP-Einstellungsdatei finden Sie unter Linux im Ordner /etc. Das rudimentäre Gästebuch im Beispiel ist in zwei Dateien aufgeteilt: formular.php und eintragen.php. Das hat den Vorteil, dass die Gästebuch-Daten einfach per Formular und POST-Methode übertragen werden können. Sie finden auf der Heft-CD drei Versionen der Skripts: ungeschützt, ohne Sessions und mit allen Schutzmaßnahmen. Sie installieren die Skripts, indem Sie sie auf einen PHP-fähigen Webserver kopieren und ausführbar machen. Außerdem brauchen Sie Schreibrechte in dem Ordner, in dem Sie die Skripts ablegen. Der Inhalt des Gästebuchs wird dort nämlich in der Datei blog.txt abgelegt.
Um zu testen, ob dieses Gästebuch anfällig für Spam ist, brauchen Sie kein Spam-Skript. Sie können einfach per Zwischenablage einen vorbereiteten Text eintragen. Wenn Sie den Zurück-Button des Browsers nutzen, werden Sie sehen, dass man problemlos einen Eintrag pro Sekunde speichern kann. Spam-Skripts sind natürlich noch schneller.
Um festzustellen, wie schnell das Formular ausgefüllt wurde, wird beim Aufruf der beiden Skript-Dateien jeweils die Zeit genommen. Wenn der Benutzer formular.php anfordert, startet der Timer. Wenn er das Formular fertig ausgefüllt hat, schickt er es ab und ruft damit eintragen.php auf. Wieder wird beim Aufruf die Zeit festgestellt. Die Differenz zwischen den beiden Timestamps muss größer als drei sein, damit der Eintrag akzeptiert wird. Statt drei Sekunden können Sie natürlich auch einen anderen Grenzwert eintragen.
Zeitstempel
Kommentar-Spam verhindern
Die Zeit nehmen Sie in beiden Skripts mit der PHP-Funktion time(). Den Zeitpunkt, zu dem das Formular in den Browser geladen wird, legen Sie in der Variable ladezeit ab. Wenn register_globals auf On geschaltet ist, können Sie die aktuelle Zeit so als verborgene Variable in Ihr Formular einbauen:
<input name="ladezeit" type="hidden" value="">
Auf der anderen Seite, im Skript eintragen.php, kommt der Ladezeitpunkt des Formulars in der Variablen $ladezeit an. Die Zeitstempel erscheinen im unverständlichen Unix-Format, das die Sekunden seit 1970 zählt. Das spielt aber für Ihre Zwecke keine Rolle. Die Differenz zwischen zwei Zeitstempeln ergibt einen sinnvollen Wert in Sekunden, nur auf den kommt es an. Ist die Differenz zu klein, wird das Skript abgebrochen, weil das Formular zu schnell ausgefüllt wurde:
$spamschutz = 3;
if (time() - $ladezeit < $spamschutz) {
echo "Ihr Eintrag hat eine Spamschutzregel ausgelöst.";
exit();
}
Theoretisch könnte man die Zeit auch in Javascript abfragen. Da Javascript aber auf dem Client-PC im Browser ausgeführt wird, lässt es sich vom Spammer manipulieren. Auf den PHP-Timer des Servers hat der Spammer dagegen keinen Zugriff.
Schutz verfeinern
Kommentar-Spam verhindern
Ihr Spamschutz funktioniert jetzt in der ersten Stufe: Wer das Formular zu schnell ausfüllt, wird abgeblockt. Aber wenn ein Spammer das bereits ausgefüllte Formular mit dem Zurück-Button des Browsers wieder aufruft, bleibt dort die alte Zeitangabe stehen, und er kann sein Posting wiederholen, so oft er will. Außerdem kann er das Formular lokal speichern, manipulieren und per Skript beliebig oft weiterverwenden. Zudem hat der Spammer im Quelltext des Formulars Zugriff auf den Zeitstempel. Er könnte also ein Skript schreiben, das das Formular herunterlädt, den Zeitstempel um 300 Sekunden zurückstellt, das Formular ausfüllt und abschickt.
Um das zu verhindern, sollte der Zeitstempel nicht mehr zwischen Server und Client hin- und hergeschickt werden. Stattdessen wird das PHP-Skript so angepasst, dass der Zeitstempel auf dem Server bleiben kann. Die Frage ist nur: Woher weiß der Server, welcher Zeitstempel zu welcher Benutzereingabe gehört? Sessions sind die Antwort.
Sessions schützen
Kommentar-Spam verhindern
PHP verfügt über eine ausgeklügelte Sitzungsverwaltung, mit der Sie Benutzereingaben und andere Variablen über mehrere Seiten hinweg speichern können. Wenn Sie Sessions benutzen, können Sie außerdem Variablen definieren, die den Server nie verlassen. Machen Sie sich das zu Nutze, um den Zeitstempel dem Zugriff des Spammers zu entziehen. Dazu starten Sie ganz am Anfang des Formulars eine PHP-Session:
Die Ladezeit wird nun nicht mehr als Hidden-Wert ins Formular eingetragen, sondern bleibt als Session-Variable auf dem Server. Variablen, die zu einer Session gehören, legt PHP in dem Array $_SESSION[] ab. Das sieht so aus:
$_SESSION['ladezeit']=time();
Wenn der Client Cookies erlaubt, funktioniert das schon. Für den Fall, dass Cookies abgeschaltet sind, sollte die Session-ID noch im Action-Attribut des Formulars übergeben werden:
<form action="eintragen.php?" method="post">
Die Konstante SID wird ohne Dollarzeichen geschrieben. Sie enthält neben der eigentlichen Session-ID auch noch den Variablennamen, in der der Server die ID ablegt, sowie ein Gleichheitszeichen. Im Browser des Benutzers sieht das dann so aus:
http://server/php/eintragen.php?PHPSESSID
=93c48399944d5c7a9c11622910d570c5
Nun wird im Formular eine Session-ID erzeugt und ein Timestamp als Session-Variable gespeichert. Das Skript Eintragen findet anhand der Session-ID den Zeitstempel auf dem Server, ohne dass der Benutzer Zugriff darauf hat. Dieser Zeitstempel wird wie gehabt ausgewertet:
if (time() - $_SESSION['ladezeit'] < $spamschutz) {
echo "Ihr Eintrag hat eine Spamschutzregel ausgelöst: zu schnell.";
exit();
}
Nur mit Stempel
Kommentar-Spam verhindern
Diese Abfrage lässt sich aber austricksen, indem ein Angreifer das Skript ohne Zeitstempel aufruft. Damit wäre die Variable gleich Null. Die Zeitspanne, die das Skript misst, wäre dann zwar über 30 Jahre lang, aber das fällt dem Skript in seiner jetzigen Form nicht auf. Als Gegenmaßnahme bauen Sie noch eine Abfrage ein, die überprüft, ob ein Zeitstempel vorhanden ist:
if (! isset($_SESSION['ladezeit'])) {
echo "Ihr Eintrag hat eine Spamschutzregel ausgelöst: kein Timestamp.";
exit();
}
Als zusätzliche Maßnahme sollen innerhalb einer Sitzung nur begrenzt viele Einträge gemacht werden können. Dazu wird eine Zählvariable ganz am Ende des Eintrag-Skripts um eins erhöht:
$_SESSION['eintrag']++;
Der dazugehörige Grenzwert wird am Anfang definiert, und schon kann die Anzahl der Einträge begrenzt werden:
$anzahl=5;
if ($_SESSION['eintrag'] > $anzahl ) {
echo "Ihr Eintrag hat eine Spamschutzregel ausgelöst:
";
echo "Sie haben bereits zu viele Einträge gemacht: ";
echo $_SESSION['eintrag'];
exit();
}
Fake-Session-IDs
Kommentar-Spam verhindern
Eine Sicherheitslücke hat das Skript aber noch. Ein Spammer könnte dem Server nämlich eine gefälschte Session-ID unterschieben. Er kann dazu eine beliebige Fake-ID nur an den Link des Formulars anhängen:
http://server/php/formular.php?PHPSESSID=fake
Der Server legt dann für die gefälschte Session einen gültigen Zeitstempel an. Auch wenn der Nutzen für den Spammer in diesem Fall gering ist, sollten Sie solche Manipulationen verhindern.
Wenn ein ehrlicher Benutzer in das Gästebuch schreibt, sind beim ersten Aufruf des Formulars weder Timestamp noch Session-ID vorhanden. Ruft er das Formular erneut auf, ist beides da. Ein manipulierter Aufruf ist also daran zu erkennen, dass zwar eine Session-ID vorhanden ist, aber kein Zeitstempel. Das ergibt in PHP die folgende Bedingung, die ganz am Anfang ins Formular eingetragen werden muss ? noch vor dem HTML-Header und vor dem Start der Session:
if (! isset($_SESSION['ladezeit'] and isset($PHPSESSID)) {
echo "Sie haben eine Spamschutzregel ausgelöst: ";
echo "Session-ID ohne Timestamp."
exit();
}
Fazit
Kommentar-Spam verhindern
Interaktive Web-Angebote lassen sich durch einfache Maßnahmen wie Timer wirkungsvoll vor Spam-Bots schützen. Zwar ist auch ein mit Timer geschütztes Gästebuch leider nicht hundertprozentig sicher vor Spammern. Wenn die Stoppuhr-Methode Verbreitung findet, werden die Spammer irgendwann Wartezeiten in ihre Skripts einbauen. Aber wenn sie das tun, dann verbrauchen die Skripts ein Vielfaches an Rechenzeit und Speicher auf Seiten der Spammer. Und noch ist es nicht so weit. Bisher ist noch kein Spam-Skript aufgetaucht, das Timer überwindet.
Alle Dateien und Listings zum Workshop finden Sie auf der Heft-CD und unter listings.internet-pro.de.