Turing für alle

Wer vermeiden will, dass Bots die eigenen Webformulare ausfüllen und Schaden in der Webanwendung anrichten, baut Hindernisse wie Captchas ein, die den Nutzer zwingen, zunächst eine verzerrte Zeichenkette richtig einzugeben. Der Dienst reCaptcha übt neben dieser Aufgabe sogar noch einen Nebenjob aus.

In Pocket speichern vorlesen Druckansicht 14 Kommentare lesen
Lesezeit: 7 Min.
Von
  • Stefan Mintert
Inhaltsverzeichnis

Kommunikation über öffentliche Webanwendungen ist immer der Gefahr von Spam ausgesetzt. Um den zu verhindern, muss man Zugriffe dahingehend voneinander unterscheiden, ob sie von Menschen oder Spam-Software ausgehen. Für diese Aufgabe sind Captchas ein üblicher Weg.

Das Verfahren ist im Prinzip einfach, im Detail jedoch kompliziert. Normalerweise besteht ein Captcha aus einem verzerrt dargestellten Wort, der sogenannten „Challenge“ (siehe Abbildung 1). Ein menschlicher Betrachter soll den Text trotz verzerrter Darstellung leicht erkennen und in ein Kontrollfeld eingeben können; erst bei einem Erfolg ist die Benutzung der gewünschten Webanwendung erlaubt. Eine automatische Schrifterkennung ist im Idealfall unmöglich. Wikipedia zeigt die verschiedenen Ansätze, eine Erkennung durch Software zu erschweren.

Eine typische Captcha-Challenge mit verzerrtem Text. Varianten stellen einfache Rechenaufgaben verzerrt dar (Abb. 1).

Für Softwareentwickler stehen eine Reihe von Captcha-Implementierungen zur Verfügung, die man in eigene Webanwendungen integrieren kann (siehe iX-Link). Die Güte des damit gewonnenen Schutzes hängt von der Qualität der generierten Grafiken ab. Es gibt immer wieder Berichte über automatisch gelöste Captchas. Die Spam-Industrie rüstet auf, die Captcha-Entwickler rüsten nach – eine Parallele zur Entwicklung von Viren und Anti-Viren-Software. Ein Unterschied ist, dass Menschen Captchas leicht, Maschinen sie aber nur schwer lösen können. Schließlich geht es darum, Mensch und Maschine zu unterscheiden, wie schon der Begriff „Captcha“ in seiner ausgeschriebenen Form sagt: Completely Automated Public Turing test to tell Computers and Humans Apart – zu Deutsch: vollautomatischer öffentlicher Turing-Test, um Computer und Menschen zu unterscheiden.

Die einfache Lösbarkeit durch Menschen sorgt für neue Arbeitsplätze in der Spam-Industrie. Im April berichtete die New York Times von bezahlten Captcha-Lösern in „Indien, Bangladesch, China und anderen Entwicklungsländern“. So sollen 80 bis 120 US-Cent für 1000 gelöste Captchas gezahlt worden sein. Die Zeitung zitiert einen Google-Mitarbeiter mit der Aussage, dass derlei zeige, dass Captchas funktionieren. Massenhaftes Erzeugen von Benutzerkennungen werde allerdings durch die mit dem Captcha-Lösen verbundenen Kosten weniger attraktiv. Ein Firmenvertreter eines indischen Dienstleisters bestätigt dies im Artikel. Seine Firma biete das Lösen von Captchas nicht länger an, weil es unprofitabel sei.

Selbst wenn das manuelle „Knacken“ der Tests tatsächlich keine Zukunft hat, gilt es dennoch, das Überlisten durch Software zu vermeiden; andernfalls verlören die Captchas ihren Sinn. Hat man eine Captcha-Bibliothek in seiner Webanwendung, die nach heutigem Stand ausreichenden Schutz bietet, muss man stets nachziehen, wenn der Gegner sich verbessert hat. Falls die verwendete Bibliothek nicht weiterentwickelt wird, muss man eventuell die Implementierung austauschen.

Eine Alternative besteht darin, keine Captcha-Bibliothek in die eigene Software einzubauen, sondern einen Webservice zu verwenden. Der Aufwand für das „Aufrüsten“ liegt in diesem Fall auf der Seite des Serviceanbieters. Ein solcher, mittlerweile beliebter Dienst ist reCaptcha. Er wurde an der Carnegie Mellon University entwickelt und später an Google verkauft. Laut Wikipedia liefert reCaptcha 30 Millionen Captchas pro Tag aus (Stand: September 2009). Große Webportale wie Facebook und Twitter setzen den Dienst ein.

Das Besondere an reCaptcha ist, dass die Challenges zwei Begriffe zeigen. Der eine ist der verzerrte, dem Captcha-Server bekannte Begriff, den der menschliche Betrachter richtig eingeben muss, um den Zugang zu einer Webanwendung zu erlangen. Der andere stammt aus dem Scanning von gedruckten Vorlagen, die Google digitalisieren möchte. Da die Schrifterkennung (Optical Character Recognition, OCR) für diesen Begriff fehlgeschlagen ist, sollen nun menschliche Betrachter die Challenge lösen: Wenn hinreichend viele Benutzer den unerkannten Begriff gleichlautend interpretieren, gilt er als erkannt.

Auf diese Weise haben die reCaptcha-Nutzer dazu beigetragen, von dem 130 Jahre umfassenden Archiv der New York Times schon 20 Jahre zu digitalisieren, vermutlich ohne es zu wissen. Die ausstehenden 110 Jahre sollen laut Wikipedia bis Ende 2010 aufgearbeitet sein.

Die Funktionsweise von reCaptcha ist anhand der Abbildung 2 schnell erklärt. Der eigene Application-Server liefert in Schritt 1 eine Webseite aus. Sie enthält in einem Formular-Element JavaScript-Code, der eine Challenge vom reCaptcha-Server in die Seite einbettet (Schritt 2). Die Challenge ist durch ein sogenanntes Challenge-Token eindeutig gekennzeichnet. Das Formular kann weitere Felder enthalten, die den Benutzer beispielsweise auffordern, seinen Namen, seine E-Mail-Adresse et cetera einzugeben.

Application-Server in der Mitte zwischen reCaptcha-Server und Formularnutzer (Abb. 2)

Der Benutzer schickt das ausgefüllte Formular mitsamt seiner Challenge-Lösung und -Token an die Webanwendung (Schritt 3). Diese muss nun prüfen, ob er die Challenge korrekt gelöst hat oder nicht. Da sie das nicht selbst kann, stellt sie ihrerseits einen Request mit Lösungsvorschlag und Token an den reCaptcha-Server. Je nach Ausgang der Prüfung kann der Application-Server dem Benutzer Zugriff gewähren oder nicht. Um Missbrauch zu vermeiden, verwendet reCaptcha Public/Private-Key-Paare für den Zugriff auf den API-Server.

Auf der Client-Seite steht neben der JavaScript-Implementierung eine weitere zur Verfügung, die ohne die Skriptsprache auskommt. Sie verwendet statt dessen einen iframe. Listing 2 erweitert Listing 1, sodass es mit und ohne JavaScript funktioniert.

Mehr Infos

Listing 1: Einbinden des reCaptcha-Dienstes

<script
type="text/javascript"
src="http://api.recaptcha.net/challenge?k=<your_public_key>">
</script>
Mehr Infos

Listing 2: Ohne JavaScript

<noscript>
<iframe src="http://api.recaptcha.net/noscript?k=<your_public_key>"
height="300" width="500" frameborder="0"></iframe><br>
<textarea name="recaptcha_challenge_field" rows="3" cols="40">
</textarea>
<input type="hidden" name="recaptcha_response_field"
value="manual_challenge">
</noscript>

Ohne JavaScript ist die Bedienung für den Benutzer jedoch aufwendiger. Er muss zunächst die Challenge im iframe lösen und absenden. Die darauf erscheinende verschlüsselte Antwort kopiert er in das textarea-Feld (im Listing mit dem Namen recaptcha_challenge_field). In einem zweiten Schritt, dem Absenden des „äußeren“ Formulars, schickt er seine eingegebenen Daten an den Application-Server.

Für die Behandlung in der eigenen Webanwendung stehen reCaptcha-Bibliotheken für mehrere Sprachen und Plug-ins für einige weit verbreitete Webanwendungen zur Verfügung. Dazu gehören Java, .Net, Perl, PHP, WordPress, Typo3, PHPBB, MediaWiki und Coldfusion. Die serverseitige Behandlung in Java erfolgt in wenigen Zeilen, wie Listing 3 zeigt. Die Variable validity enthält das Ergebnis der Prüfung.

Mehr Infos

Listing 3: Java-Code

ReCaptchaResponse response = captcha.checkAnswer(
request.getRemoteAddr(),
request.getParameter("recaptcha_challenge_field"),
request.getParameter("recaptcha_response_field"));
boolean validity = response.isValid();

Das Erscheinungsbild von reCaptcha lässt sich dem der eigenen Webseite anpassen. Dafür stehen „Themes“ zur Verfügung, die in folgender Weise zur Anwendung kommen.

<script type="text/javascript">
var RecaptchaOptions = {
theme : '<theme name here>',
lang: 'de'
};
</script>

reCaptcha lässt sich leicht an die Farbgebung der eigenen Webanwendung anpassen (Abb. 3).

Neben der Theme-Wahl zeigt das Codebeispiel, dass eine deutsche Benutzeroberfläche gewählt werden kann. Das reCaptcha-Wiki dokumentiert derzeit vier Themes, von denen sich „clean“ anbietet, wenn nur die Farbgebung geändert werden soll. Für weitergehende Änderungen ist „custom“ in Verbindung mit etwas mehr HTML-Code zu verwenden. Ausgehend von „clean“ sind Farbänderungen mit wenig CSS-Code zu erledigen, siehe dazu Abbildung 3 und Listing 4.

Mehr Infos

Listing 4: Stilzuweisungen

.recaptchatable .recaptcha_image_cell, #recaptcha_table {
background-color:#fff !important; //reCaptcha widget background color
}

#recaptcha_table {
border-color: #4D4C4D !important; //reCaptcha widget border color
}

#recaptcha_response_field {
border-color: #FFA015 !important; //Text input field border color
background-color:#ffffff !important; //Text input field background color
}

reCaptcha ist eine einfach zu nutzende Captcha-Lösung, die auf einem kostenlosen Webservice basiert und nur wenig Code in der eigenen Webanwendung erfordert. Im Gegenzug für die kostenlose Nutzung „hilft“ der Benutzer bei der Digitalisierung von Werken, wie dem Archiv der New York Times. Im Gegensatz zu Captcha-Implementierungen in der eigenen Software kümmert sich bei reCaptcha der Dienstanbieter um die ständige Weiterentwicklung des Sicherheitsstandards.

ist Webexperte bei Linkwerk, wo reCaptcha zur Spam-Vermeidung in Webanwendungen zum Einsatz kommt.

[1] Hubert Benjamin Ritzdorf; Webprogrammierung; Mensch oder Maschine; Captchas in PHP, iX 1/2008, S. 142

[2] Jörn Wagner; Webprogrammierung; Gestaffelte Abwehr; Das Ende der Bild-Captchas; iX 4/2008, S. 120

Links zu diesem Artikel (hb)