Weblog ohne Spam
Werbefrei

SicherheitSicherheitsmanagement

Weblogs werden immer öfter Opfer von Spammern, die Links zu ihren Seiten als Kommentare hinterlassen. Doch mit wenig Aufwand schützen Sie sich vor diesen Kommentar-Spammern.

Viagra & Co. nun auch im Blog

Weblog ohne Spam

Spammer sind der Albtraum der Internet-Generation. An überfüllte Mailboxen mit Angeboten zu Viagra oder Software hat man sich mittlerweile mehr oder weniger unfreiwillig gewöhnt. Aber nun drängen die Spammer immer mehr auch in die Foren und Weblogs.

Dabei können Foren und Weblogs eine enorme Verbreitung im Web aufweisen und sind ein gern genutztes Medium, um bestimmten Personenkreisen Hilfestellung zu bieten, um sich auszutauschen oder um die eigenen Gedanken zu veröffentlichen. Es gibt jedoch Personen, die immer wieder automatisiert Nachrichten oder Kommentare posten, um ein Forum oder ein Weblog als Werbefläche zu nutzen. Dies ist natürlich nicht im Sinne des Besitzers des Forums.

Die Lösung für dieses Problem heißt Captcha. Was sich im ersten Moment wie ein Ausruf eines Motivationsgurus anhört, ist die Abkürzung für Completely Automated Public Turing-test to Tell Computer and Humans Apart. Captcha bezeichnet also eine Methode, um automatisch Mensch und Computer unterscheiden zu können. Dabei macht sich diese Methode ein großes Problem des überwiegenden Teils der Computer zunutze: Computer können nicht »sehen«. Also wird kurzerhand ein Code generiert, und als Grafik ausgegeben, der zur Autorisierung eingegeben werden muss.

Nun gibt es jedoch Texterkennungsprogramme, die durchaus in der Lage sind, Texte aus Grafiken herauszulesen. Jedoch nur in einem sehr begrenzten Maß. Denn sobald der Text nicht mehr schwarz auf weiß zu lesen ist, sondern sich dahinter ein Rechteck-Muster befindet oder der Text verzerrt wird, stößt auch die beste OCR-Software an ihre Grenzen und kann nichts mehr erkennen.

Die Theorie von Captchas klingt relativ einfach, und auch in der Praxis lassen sie sich schnell ein einfach realisieren. Dennoch sind dennoch ein paar Kniffe notwendig, damit der gewünschte Sicherheitseffekt nicht zufällig anderweitig aufgelöst wird.

So genannte Captcha-Codes eignen sich darüber hinaus nicht nur für die Kommentar-Funktion von Weblogs: Jede Art von Formulare lässt sich hiermit schützen, wie beispielsweise Feedback-Formulare oder auch Bestellseiten bei Online-Shops.


Lösungsansätze

Weblog ohne Spam

Das Ziel ist eindeutig: Eine Grafik soll erzeugt werden, in der ein Code ausgegeben wird, der so weit entfremdet ist, dass zwar ein Mensch die Zeichen noch lesen kann, ein Computer jedoch überfordert ist.

Eine Möglichkeit bestünde darin, eine Grafik mit einem festen Code zu erstellen und zu nutzen. Jedoch würde diese Methode sicherlich keinen Workshop-Artikel rechtfertigen. Außerdem würde der Code derselbe bleiben und somit müsste der Computer keine großen Anstrengungen unternehmen. Hieraus ergibt sich, dass die Grafik also dynamisch erzeugt werden muss.

Weiterhin muss geklärt werden, wie die Grafik eingebunden werden kann. Damit das System möglichst flexibel und ohne große Anpassungen in unterschiedlichen Umgebungen eingesetzt werden kann, wird die Grafik mittels des img-Elements ausgegeben. Als Quelle für die Grafik wird das PHP-Skript angegeben, das die Grafik erzeugt. Ein Problem gibt es jedoch: den Code.

Nun könnte das PHP-Skript, das gleichzeitig die Grafik erzeugt, auch zufallsgeneriert einen Code erzeugen. Aber wie wird dem Empfängerskript des HTML-Formulars bekannt gegeben, wie der Code lautet? Alle Lösungsideen, bei denen Sie keine Sessions einsetzen, bergen entweder irgendein Sicherheitsrisiko oder führen zu einem unnötigen Mehraufwand. Nehmen Sie als Beispiel die Methode, in welcher der Code vom Eingabe-Skript erzeugt wird. Der Code wird anschließend im img-Element an das PHP-Skript übergeben, das die Grafik erzeugen soll, und zusätzlich über ein verstecktes Eingabefeld an das verarbeitende Skript. Ein kurzer Blick in den HTML-Quelltext genügt und der Übeltäter wüsste sofort, wie sein Spam-Tool die Sicherung umgehen kann. Verwenden Sie hingegen Cookies, in denen Sie den Code ablegen möchten, sollten Sie bedenken, dass das Spam-Tool als Browser fungiert und somit ebenfalls einen uneingeschränkten Zugriff auf die Cookies hat.

Mehraufwand entsteht Ihnen beispielsweise dann, wenn Sie den Code in einer Datenbank speichern möchten. Wenn Sie ohne Cookies arbeiten, müssten Sie dem PHP-Skript, das die Grafik erzeugen soll, eine ID übergeben, anhand derer es den Code in der Datenbank finden kann. Das Empfänger-Skript müsste nun ebenfalls die ID übergeben bekommen und wiederum in der Datenbank den Code zur Verifizierung suchen. Abschließend müsste der Code wieder aus der Datenbank gelöscht werden. Das macht insgesamt vier Datenbankanweisungen, die je nach Anzahl der Benutzer multipliziert werden müssen. Da schon die Erzeugung der Grafik ein ganzes Stück Rechenaufwand erfordert, sollten unnötige Schritte vermieden werden. Außerdem erfordert diese Variante, dass auch ein Datenbanksystem zur Verfügung steht, und eine Tabelle müsste eingerichtet werden. Flexibilität ade!

Ihnen bleibt also lediglich der Weg über Sessions, um einerseits größtmögliche Sicherheit zu erreichen, denn die Daten einer Session werden auf dem Server und nicht auf dem Client-Rechner gespeichert. Andererseits ist der Aufwand bei Verwendung von Sessions sehr gering und die Portabilität bleibt erhalten.


Zufallscode erzeugen

Weblog ohne Spam

Beim Erzeugen des Zufallscodes gilt es zu beachten, dass keine Buchstaben verwendet werden dürfen, die verwechselt werden könnten. Denn selbst das menschliche Auge spielt uns manchmal einen Streich, vor allem dann, wenn es uns auch noch schwer gemacht wird. Typische Zeichen, die relativ leicht verwechselt werden können sind 1 (Eins), L, I und J, ferner O und 0 (Null) sowie U und V. Finden sich diese nicht in einem konkreten Zusammenhang wieder, etwa als Teil eines Wortes, lassen sich besonders der Buchstabe O und die Zahl 0 extrem leicht verwechseln. Folgende Buchstaben und Zeichen sollten zu den geringsten Verwechslungen führen: ABCDEFGHKMPQRSTWXZ245789.

In einer Schleife wird nun mittels der Funktion rand eine beliebige zufällige Zeichenfolge aus dem oben genannten Zeichensatz zusammengestellt. Außerdem wird überprüft, ob sich innerhalb des Codes eine unerlaubte Zeichenfolge befindet. Diese gesamte Aufgabe übernimmt in der spamguard.lib.php die Funktion generateSpamGuardCode. Die Länge des zu erzeugenden Codes kann ihr als Parameter übergeben werden. Je länger die Zeichenfolge, desto sicherer; gleichzeitig gestaltet sich aber auch das Eingeben unpraktischer.

Die Grafik selbst wird erzeugt von der Funktion createSpamGuardImage. Ihr werden die Breite und die Höhe der Grafik übergeben, sowie das Arbeitsverzeichnis und der Zufallscode. Sie nutzt dabei die GD-Library, um eine neue Grafik zu erstellen und ein bereits existierendes Bild als Basis zu verwenden. Anschließend wird per Zufall ein Winkel für die Textausrichtung ermittelt. Die Begrenzung liegt dabei zwischen -8° und +8°. Somit wird verhindert, dass der Code kopfüber in der Grafik ausgegeben wird, was nur bedingt lesbar wäre.

Abschließend wird die Text mit dem Captcha-Code fast mittig in der Grafik platziert und die Grafik als JPEG an den Browser gesendet. Gerade JPEG eignet sich an dieser Stelle sehr gut, da durch einen hohen Kompressionsfaktor eine gewisse Unschärfe durch die Artefaktbildung erzeugt werden kann. Was in vielen anderen Fällen wohl eher ein Nachteil ist, kann man sich an dieser Stelle praktischerweise zunutze machen.


Grafik einbinden

Weblog ohne Spam

Beachten Sie auf jeden Fall, dass Sie das Arbeitsverzeichnis, also den vollständigen Pfad zur spamguard.lib.php, korrekt ermitteln. Denn die Spamguard-Library nutzt Truetype-Fonts, um den Code auszugeben, und die GD-Library benötigt immer einen absoluten Pfad zur Schrift-Datei. Unter Windows sollten Sie zudem beachten, dass die Schriftarten-Datei auf dem gleichen Laufwerk liegen muss wie die PHP-Skripts.

In Ihrem HTML-Formular können Sie nun durch folgenden Code die Grafik anzeigen lassen:

Der PHP-Quelltext des Skripts codeimage.php sieht dabei wie folgt aus:


session_start();
// SpamGuard einbinden
include ('spamguard/spamguard.lib.php');
// Grafik erzeugen
header('Content-Type: image/jpeg');
$strCode = generateSpamGuardCode(4);
$_SESSION['SPAMGUARD_CODE'] = $strCode;
createSpamGuardImage(150,50,$_SERVER['DOCUMENT_ROOT'].'/spamguard/', $_SESSION['SPAMGUARD_CODE']);
?>

Zunächst wird die Session gestartet und die Library eingebunden. Nun muss der Header modifiziert werden, damit der Browser weiß, dass kein Text als Ausgabe erfolgt, sondern eine JPG-Grafik. Der Zufallscode wird erzeugt und in der Variablen $strCode gespeichert sowie in der Session registriert. Anschließend wird die Grafik erzeugt.

Um das absolute Arbeitsverzeichnis ermitteln zu können, wird einfach auf die Umgebungsvariable $_SERVER[?DOCUMENT_ROOT?] zurückgegriffen. Nun muss nur noch der Teilpfad vom htdocs


Code überprüfen

Weblog ohne Spam

Im Empfänger-Skript des HTML-Formulars können Sie den eingegebenen Code nun folgendermaßen überprüfen: Initialisieren Sie die Session und prüfen Sie den Wert von $_SESSION[?SPAMGUARD_CODE?] mit dem Code, den der Anwender eingegeben hat. Achten Sie darauf, dass Sie bei dem Vergleich die Groß- und Kleinschreibung nicht berücksichtigen. Die Anwender sind es so gewohnt. Verwenden Sie einfach die Funktion strToLower und wenden Sie die Funktion auf beide Werte an.


Fazit

Weblog ohne Spam

Die hier gezeigte Methode zum Erzeugen von Captchas ist sehr sicher und trotzdem denkbar einfach. Sie müssen lediglich die Dateien an den gewünschten Ort kopieren und ein paar kleine Zeilen in Ihr bestehendes Projekt einfügen. Verbesserungsmöglichkeiten finden sich beispielsweise in der Auswahl der Hintergrundgrafik. So könnte durch Zufall eine beliebige Grafik verwendet werden. Das würde es einem Spammer in diesem Moment zusätzlich erschweren. Wenn auch noch die Schriftart zufallsgesteuert ausgewählt wird, ist das System fast unknackbar.

Und nicht einmal das Kapern einer Session könnte zu einem Sicherheitsrisiko werden, da der Code auf dem Server gespeichert ist und nicht etwa in einem Cookie abgelegt wird.

Natürlich könnte das System noch insofern erweitert werden, dass die Grafik vor der Ausgabe noch einmal verzerrt wird, zum Beispiel durch einen Welleneffekt. Aber hier stellt sich die Frage, ob sich der Aufwand lohnt, denn diese Möglichkeit bietet die GD-Library bisher noch nicht, und Sie müssten ihn zunächst selbst programmieren.

Die hier vorgestellte Captcha-Lösung ist für die meisten Zwecke ausreichend und bietet einen hinreichenden Schutz vor lästigen Spammern. Mit dieser Lösung können Sie sämtliche Webformulare schützen, welche schnell Opfer von Spammern werden können.


Google im Kampf gegen Spam

Weblog ohne Spam

Kommentar-Spammer sind nicht nur für Weblog-Betreiber ärgerlich ? auch Suchmaschinen indizieren die Kommentare und werden so mit Werbung überflutet. Google will mit technischen Mitteln gegen die lästigen Kommentar-Spammer vorgehen. So sollen Links, welche Seitenbesucher posten können, zukünftig nicht mehr bei der Berechnung der Link-Popularität beachtet werden. Möglich werden soll dies durch eine von der Weblog-Software vorgenomme Ergänzung des Link-Tags um das Attribut rel=?nofollow?. Die beiden Suchmaschinen MSN und Yahoo wollen sich ebenfalls an dieser Initiative beteiligen. Auch für Weblog-Software stehen bereits Plug-ins zur Verfügung, unter anderem für WordPress.

Standardkonforme Erweiterung
Auch auf technischer Seite stellt die von Google initiierte Erweiterung des Link-Tags kein Problem dar. Das Attribut rel in Links erlaubt als Wert eine beliebige CDATA-Zeichenkette. Die Erweiterung rel=?nofollow? ist somit konform zum XHTML-Standard. Aus einem Link wie

free sex

wird somit

free sex

Geteilte Meinungennofollow-Links nicht daran gehindert, weiterhin automatische Kommentare zu posten. Für den Weblog-Betreiber bringt diese Erweiterung daher also erst einmal gar nichts. Im Grunde wollen die Suchmaschinenbetreiber das nofollow-Attribut dazu nutzen, um ihre Suchmaschinen Spam-frei zu bekommen. Damit Weblogs für Spammer uninteressant werden, müssten jedoch ausnahmslos alle Weblogs diese Technik einsetzen.