Von Maschinen und Menschen

31.05.2010

botEs war einmal, das Internet. Es war unterteilt in drei große Lager:

  • Die Entwickler / Anbieter von Webseiten
    Sie stellen all die netten Seiten und Dienste im Netz zur Verfügung, erhoffen sich dadurch große Gewinne und hassen Spammer.
  • Die „normalen und unbedarften“ User
    Sie surfen wahllos durch das Internet auf die Seiten und Dienste der Anbieter und geben dort ihr sauer verdientes Geld aus.
  • Die Spammer
    Sie nerven alle, indem sie in Formularen und Foren der Anbieter (von den Postfächern der User ganz zu schweigen) unerwünschte Werbung über Sachen verbreiten die eigentlich sowieso kein Mensch braucht.

Vermutlich – nein, wahrscheinlich – gibt es noch mehr Lager und Parteien die irgendwie für das Netz relevant sind, allerdings wollen wir uns heutzutage mal nur mit diesen Dreien beschäftigen, denn gerade zwischen ihnen ist die Beziehung besonders schwierig.
Die Fronten sind klar: Anbieter wollen eigentlich nur mit den Usern/Kunden kommunizieren und die Spammer am liebsten aussperren, welche das Web mit unerwünschten (und vor allem unbezahlten) Werbeanzeigen und Links zu dubiosen Webseiten überschwemmen.

Die Spammer bedienen sich dazu diverser Crawler und Bots. Das sind kleine Programme, welche das Web abgrasen und im Quelltext von Webseiten nach E-Mail Adressen und Formularen suchen.
Und wenn ein Mensch Texte in einem Formular eingeben kann, dann kann das auch ein Bot: Völlig automatisiert überfluten sie Gästebücher und Foren mit Werbetexten und Links.

Schnell war eine Waffe gegen die fleißigen, aber dummen Programme gefunden: das CAPTCHA (Completely Automated Public Turing test to tell Computers and Humans Apart).
Die Grundlage ist einfach: Dem User wird ein Objekt (Grafik, Animation, Ton, etc.) präsentiert, das zwar einfach von einem Computer zu erzeugen ist der die Ausgangsdaten hat, allerdings wiederum schwer von einem Computer gelöst werden kann.Das menschliche Hirn ist der fortschrittlichste Apparat zum Erkennen von Formen und Mustern auf diesem Planeten, deshalb fällt es dem Durchschnittsmenschen leicht die Bedeutung eines verzerrten Textes zu erkennen und diese einzugeben.Allerdings nur dem Durchschnittsmenschen: Blinde Menschen waren zum Beispiel schon immer stark eingeschänkt Webseiten welche durch CAPTCHAS geschützt sind zu nutzen, da es für sie unmöglich ist das Bild zu betrachten.Dieses System verhinderte lange Zeit erfolgreich das die Bots der Spammer das Internet mit ihrem Werbemüll überfluteten. Allerdings haben wir heute so immens viel Rechenleistung zu unserer Verfügung, dass auch die Computer es schaffen diese CAPTCHAs zu lösen.

Das resultiert in noch komplizierteren CAPTCHAS, die mittlerweile von „echten“ Menschen kaum noch zu lösen sind.
Ich glaube wir waren alle schon mal auf irgendeiner Website, betrachteten ein CAPTCHA und dachten nur noch: „HÄ?!“

Das muss aufhören. Es ist mir klar, dass Anbieter die Spammer bekämpfen wollen oder müssen, allerdings wird heute oftmals ohne zu überlegen ein CAPTCHA eingesetzt welches im Endeffekt auch die Unschuldigen betrifft, nämlich die normalen User/Kunden welche sich mit immer absurderen CAPTCHAS konfrontiert sehen.

Ich bin sowohl Programmierer als auch Designer, ich sehe also die Relevanz die eigenen Dienste vor Werbemüll zu schützen, allerdings tut es mir auch in der Seele weh zu sehen wie schöne Webseiten von CAPTCHAs verunstaltet werden und die Usability mit Füßen getreten wird.

Es geht auch anders!

Überlegen wir erstmal: Wie verhält sich der typische Bot, wie sich ein Mensch niemals verhalten würde, oder gar könnte?

Es gibt zwei Arten von Bots. Die Einen sind speziell auf einen Dienst zugeschnitten und verüben auch nur auf dieser einen Domain eine spezielle Tätigkeit. Sie ziehen nicht im Web umher und müssen irgendwie mit allen Seiten klar kommen, sondern es sind hochspezialisierte Programme; auf eine einzelne Webseite angepasst.
Google sieht sich zum Beispiel solchen Bots ausgesetzt, die nur darauf programmiert sind neue Mail-Accounts anzulegen, über welche dann Spammer ihre Werbung verschicken können.Die meisten der im Folgenden genannten Abwehrmethoden würden höchstwahrscheinlich bei diesen Programmen nicht greifen, da der Programmierer natürlich die Abwehr durch den Anbieter genau untersuchen würde und Gegenmaßnahmen treffen kann.

Der Standard-Bot allerdings ist nicht spezialisiert: er hangelt sich von Website zu Website und müllt alles zu was er als Kontaktformular erkennt.

Also was identifiziert einen Bot?

  • Bots haben es eilig
    Sie haben einen stressigen, langen Arbeitstag vor sich in dem sie so viele Webseiten abgrasen und zumüllen müssen wie möglich. Sie haben keine Zeit lange auf eine Website zu warten. Sobald sie den Quelltext interpretiert haben füllen sie die erkannten Formulare mit Daten aus und senden sie ab. Danach kommt die nächste Seite dran – dutzende pro Sekunde.

    Wie nutze ich das aus?
    Prüfen Sie wie viel Zeit zwischen dem Aufruf des Formulars und dem Absenden vergangen sind. Ermitteln Sie die minimale Dauer die ein Mensch benötigt um das Formular auszufüllen. Wird es bereits eine Sekunde nach dem Aufrufen wieder gesendet kann dies unmöglich von einem Menschen stammen.

  • Bots betrachten Webseiten nicht so wie ein User
    Dies geschieht a) aus Zeitgründen und b) … naja aus Zeitgründen.
    Der Bot fordert nur den Quelltext der Seite an – er lädt keine quer verlinkten Stylesheets, Bilder, Objekte – was auch immer.
    Er prüft lediglich den Quelltext auf Formulare.

    Wie nutze ich das aus?
    Nutzen Sie Honeypots! Fügen Sie Eingabefelder in Ihr Formular ein, welche Sie durch CSS unsichtbar machen. Ein Bot wird sie trotzdem ausfüllen, was ihn klar vom Menschen unterscheidet.

  • Bots interpretieren (oftmals) kein JavaScript
    JavaScript auszuführen ist nicht so trivial wie es klingt. Es gibt zwar OpenSource Engines die JavaScript verarbeiten, allerdings kann man die Website dann nicht mehr als reinen Text behandeln wie die meisten Bots es tun, sondern man muss die komplette Seite parsen und ein DOM erzeugen auf dem JavaScript dann arbeitet.
    Die meisten Bots verwenden allerdings nur RegularExpressions um im Quelltext nach Formularen zu suchen und diese „auszufüllen“.
    Auch dies geschieht wieder aus Zeitgründen, da das Parsen sehr zeitaufwändig ist.

    Wie nutze ich das aus?
    Setzen Sie zum Beispiel den action-Parameter des Formulars auf eine Seite, welche die Formulardaten gar nicht verarbeitet. Erst über JavaScript setzen Sie den action-Parameter auf das tatsächliche Formularziel.
    Machen Sie einen AJAX-Aufruf an den Server. Dies ist für den Server ein sicherer Beweis dass JavaScript aktiviert ist.

  • Bots betten keine Objekte ein
    Flash oder gar Java Objekte? Fehlanzeige, auch das sind Dinge die nur „richtige“ Browser unterstützen, dabei verhält es sich ähnlich wie beim JavaScript selbst.

    Wie nutze ich das aus?
    Betten Sie ein unsichtbares SWF- oder JAVA-Objekt in die Seite ein, welches intern einen Aufruf beim Server macht (ähnlich dem AJAX-Aufruf).
    Das Vorhandensein dieser Objekte im Browser ist ein deutlicher Hinweis darauf das sich ein echter User auf der Seite befindet.

  • Bots können keinen Kontext oder Sinn in dem erfassen was sie „sehen“
    Als Mensch betrachte ich ein Formular und die dazugehörigen Beschriftungen und weiß welche Informationen ich wo angeben muss (wenn ich nicht gerade ein Steuerformular betrachte – die Jungs haben wirklich keine CAPTCHAs nötig).
    Ein Bot kann das nicht. Relativ „intelligente“ Bots prüfen welcher Name für das Input-Tag gegeben wurde und können dann aus Schlüsselwörtern wie „name“ oder „mail“ leicht herausfinden welche Information verlangt wird. Dies sind aber Angaben welche der User wiederum nicht zu Gesicht bekommt, er muss sich auf die sichtbaren Texte verlassen, welche der Browser rendert.

    Wie nutze ich das aus?
    Setzen Sie kryptische Namen für Ihre Formularelemente ein, oder noch besser: Tauschen Sie die interne Beschriftung der Felder! Nennen Sie das Textfeld für E-Mail stattdessen einfach „age“, oder nennen Sie das Textfeld für den Namen einfach „mail“.
    Den User stört das nicht, da er sich ja an die sichtbaren Beschriftungen hält, der Bot allerdings kann dies nicht und wird die Felder falsch ausfüllen. Taucht dann im Mail-Feld keine korrekte E-Mail auf, oder plötzlich im Feld für den Namen ungewollt eine Mailadresse auf handelt es sich mit hoher Wahrscheinlichkeit um einen Bot.
    Dafür ist natürlich eine ausgefeilte Validierung der eingegebenen Daten nötig.

Dies sind einige Merkmale anhand derer man Menschen und Maschinen unterscheiden kann, ohne das der User davon überhaupt etwas mitbekommt.

Natürlich darf man nicht den Fehler machen und sich BLIND auf diese Merkmale verlassen – im Zweifelsfall kann nämlich auch ein echter Mensch mal sein JavaScript abgeschaltet haben, das Formular außergewöhnlich schnell ausfüllen oder gar CSS deaktiviert haben (auf einem Screenreader für Blinde zum Beispiel) und versehentlich Honeypot-Felder ausfüllen (kennzeichnet man diese allerdings beispielsweise durch ein „Bitte nicht ausfüllen ist das eher unwahrscheinlich).
Auch hat man eventuell mal einen besonders intelligenten Bot, der das alles umgehen kann, was aber eher unwahrscheinlich ist.

Sind alle (oder die meisten) Prüfungen fehlgeschlagen kann man immer noch eine Seite einblenden und um die Bestätigung der Informationen per CAPTCHA bitten.
Hilfreich ist in jedem Fall auch eine Validierung der eingegebenen Daten gegen Dienste wie Akismet.

Was bleibt zum Abschluss zu sagen?

Natürlich macht es für den Entwickler der Seite mehr Aufwand solche Heuristik anstelle eines einfachen CAPTCHAs einzusetzen – für den User, den Kunden allerdings sind diese unsichtbaren Prüfungen mehr als angenehm – er bemerkt gar nichts davon.
Bekannte Seiten wie Google haben allerdings das Problem dass individuell angefertigte Bots natürlich perfekt auf die Anforderungen zugeschnitten werden können, allerdings kann man auch hier mit ein wenig Kreativität genug tricksen um Bots zu verwirren (zufällig eingefügte Honeypots und zufällige Beschriftungen von Feldern, nur um ein Beispiel zu nennen).

Aber ich komme ins Schwadronieren. Mein Standpunkt sollte klar sein:

Jeder Entwickler der etwas auf sich hält und ein wenig sein Handwerk versteht sollte in der Lage sein CAPTCHAs zu vermeiden, oder nur als allerletztes Mittel einzusetzen.
CAPTCHAS gehören einfach ins letzte Jahrtausend.

Over and Out.