Captcha gegen Spam einfach erklärt

 

Ihr Kontaktformular ist seit einem Monat online, und jeden Morgen liegen zwanzig Mails im Postfach, die mit Ihren Fotos nichts zu tun haben. Irgendwann taucht dann die Frage auf, ob ein Captcha gegen Spam hilft, also eine kleine Prüfung vor dem Absenden, die Menschen durchlässt und Programme aufhält. Die Antwort hängt davon ab, welche Art von Captcha Sie wählen, wo das Formular steht und wen Sie damit ungewollt mit aussperren. Diese Seite erklärt das Prinzip an konkreten Fällen, vergleicht drei verbreitete Lösungen und zeigt, warum das Bildergalerie-Script ohne Captcha auskommt.

Captcha gegen Spam: Ein Mensch geht durch ein Tor mit Haken-Schild, ein kleiner Roboter bleibt an der Schranke vor dem Formular

Captcha gegen Spam: was hinter dem Namen steckt

Das Wort ist ein Kürzel für Completely Automated Public Turing test to tell Computers and Humans Apart. Auf Deutsch: ein Test, den ein Computer selbständig stellt und auswertet und der Menschen von Programmen trennen soll. Der Bezug auf Alan Turing kommt von seiner Frage, ob man eine Maschine im Gespräch von einem Menschen unterscheiden kann. Beim Captcha ist die Rolle umgedreht, hier prüft die Maschine den Menschen.

Lange beruhte das auf Wahrnehmung: verzerrte Buchstaben lesen, Ampeln auf Fotos finden. Programme erkennen solche Bilder inzwischen oft besser als Menschen. Moderne Verfahren prüfen deshalb etwas anderes, nämlich wie sich jemand auf der Seite bewegt, oder sie machen das Absenden für Programme teuer, indem der Browser erst eine Rechenaufgabe lösen muss. Für einen einzelnen Besucher dauert das eine Sekunde, für einen Bot, der tausend Formulare in der Stunde füllen will, summiert es sich.

Vier Bauarten im Vergleich

Was Ihnen auf fremden Seiten als Captcha begegnet, lässt sich grob in vier Gruppen sortieren. Für eine kleine Website mit Galerie unterscheiden sie sich vor allem darin, wie sehr sie echte Besucher stören und ob Daten an einen fremden Anbieter gehen.

BauartWas der Besucher tutHaken
Rätsel zum Abtippen oder Anklickenverzerrten Text eingeben oder Bildfelder auswählenlästig am Handy, schwierig bei Sehschwäche, von Programmen oft lösbar
Selbst gebaute Rechenfrage„Wie viel ist drei plus vier?“ beantworteneinmal angepasste Bots lösen sie mühelos
Verhaltensprüfung eines Anbietersein Kästchen anklicken oder gar nichtsDaten fließen an den Anbieter, Hinweis in der Datenschutzerklärung nötig
Rechenaufgabe im Browser (Proof of Work)kurz warten, bis der Browser fertig gerechnet hatbraucht JavaScript, alte Geräte rechnen länger

Das bekannteste Beispiel für die dritte Gruppe ist Google reCAPTCHA. In Version 2 sieht man das Kästchen Ich bin kein Roboter, bei Verdacht folgt eine Bildaufgabe; Version 3 zeigt gar nichts an. hCaptcha arbeitet ähnlich, kommt aber von einem anderen Anbieter. Zur vierten Gruppe zählen Friendly Captcha, ein Anbieter aus Deutschland, und das quelloffene ALTCHA, das auf dem eigenen Server läuft. Wie sich reCAPTCHA, Friendly Captcha und ALTCHA bei Kosten, Datenschutz und Einbau unterscheiden, zeigt ein Vergleich weiter unten. Keine echte Captcha-Art, aber oft die erste Wahl ist die versteckte Feldfalle, der Honeypot: ein Feld, das Menschen nicht sehen und Bots trotzdem ausfüllen.

Wie ein Captcha im Formular arbeitet

Ob selbst gebaut oder von einem Anbieter, jedes Captcha folgt demselben Ablauf. Entscheidend ist, dass die Prüfung auf dem Server stattfindet und nicht im Browser:

  1. Der Server erzeugt eine Aufgabe und merkt sich die richtige Lösung, etwa in der Sitzung des Besuchers.
  2. Der Besucher löst die Aufgabe, oder sein Browser erledigt das im Hintergrund.
  3. Beim Absenden geht die Antwort zusammen mit dem Formular an den Server.
  4. Der Server vergleicht Antwort und gespeicherte Lösung. Jede Lösung gilt nur einmal und nur für kurze Zeit.

Die Grafik spielt den Ablauf an der Rechenfrage „3 + 4“ durch. Zum Browser geht nur die Aufgabe, die Lösung 7 bleibt in der Sitzung auf dem Server. Nach dem ersten Vergleich ist sie gelöscht, dieselbe Antwort ein zweites Mal hilft also nicht.

Animiertes Ablaufdiagramm eines Captchas: Server erzeugt die Aufgabe 3 + 4 und merkt sich die Lösung 7, der Browser bekommt nur die Aufgabe, der Server vergleicht einmalig und lehnt eine Wiederholung ab
Ein Captcha schützt nur, wenn der Server die Lösung für sich behält und jede Lösung genau einmal annimmt.

Zwei Fehler machen ein selbst gebautes Captcha gegen Spam-Bots wirkungslos, und beide kommen häufig vor. Steht die richtige Antwort in einem versteckten Feld im Quelltext, liest der Bot sie einfach mit. Und prüft nur JavaScript im Browser, ob die Antwort stimmt, schickt der Bot sein Formular direkt an den Server, ohne die Seite überhaupt zu laden. Erkennen können Sie beides, wenn trotz Captcha weiter Spam eintrifft, und zwar in gleicher Menge wie vorher.

Welches Formular welche Hürde braucht

Jedes Captcha ist eine Hürde für alle Besucher, auch für die echten. Ob sie sich lohnt, hängt vom Formular ab:

  • Kontaktformular mit gelegentlichem Spam: Eine Feldfalle und eine Mindestzeit von wenigen Sekunden reichen fast immer. Ein Captcha wäre hier mehr Ärger als Nutzen.
  • Gästebuch mit regelmäßigen Spam-Wellen: Zuerst die unsichtbaren Hürden. Ein Captcha gegen Spam-Einträge lohnt sich erst, wenn danach noch täglich welche durchkommen.
  • Anmeldeseite: Hier wirkt eine Sperre nach mehreren Fehlversuchen meist besser, weil sie den rechtmäßigen Nutzer nur stört, wenn er sich mehrfach vertippt.
  • Viele Besucher am Handy oder ältere Besucher: Bildrätsel auf kleinen Bildschirmen führen zu Abbrüchen. Wählen Sie eine Bauart ohne sichtbare Aufgabe.

Denken Sie bei jeder sichtbaren Aufgabe an Menschen mit Sehbehinderung. Ein Bildrätsel ohne Alternative, etwa eine Audioaufgabe, sperrt sie vom Formular aus. Bei einem Kontaktformular, über das jemand nur eine Frage zu einem Foto stellen möchte, ist das ein unnötiger Ausschluss.

Honeypot und Mindestzeit in vier Schritten

Die beiden unsichtbaren Hürden kosten echte Besucher nichts und halten die meisten einfachen Bots auf. In einem selbst gebauten PHP-Kontaktformular sieht das so aus:

  1. Ein zusätzliches Feld ins Formular setzen, etwa <input type="text" name="website" tabindex="-1" autocomplete="off"> mit der Beschriftung „Bitte leer lassen“.
  2. Das Feld per CSS aus dem sichtbaren Bereich schieben, zum Beispiel mit position:absolute; left:-9999px, und dem umgebenden Element aria-hidden="true" geben, damit Screenreader es überspringen. Ob Sie stattdessen display:none nehmen, macht für einfache Bots kaum einen Unterschied, sie füllen jedes Feld aus, das im Quelltext steht.
  3. Beim Anzeigen des Formulars die Uhrzeit in der Sitzung merken: $_SESSION['seit'] = time();
  4. Beim Absenden auf dem Server prüfen: Ist $_POST['website'] nicht leer, oder liegen zwischen Anzeigen und Absenden weniger als 3 Sekunden, wird die Nachricht verworfen. Fehlt der Zeitstempel ganz, weil der Bot das Formular nie geladen hat, gilt das ebenfalls als zu schnell.

Kommt danach immer noch täglich Spam durch, ist ein Captcha der nächste Schritt, am besten eines aus der vierten Gruppe ohne Bildrätsel.

reCAPTCHA, Friendly Captcha oder ALTCHA: drei Wege im Vergleich

Wer für ein Kontaktformular ein Captcha gegen Spam-Nachrichten auswählt, landet meist bei einem dieser drei. Gegen einfache Bots wirken alle drei. Unterschiede gibt es bei der Frage, wer die Prüfung durchführt, was sie kostet und was in Ihre Datenschutzerklärung gehört.

LösungWer prüftKostenDatenschutzEinbau
Google reCAPTCHA v3Google, anhand des Verhaltens auf der Seitekostenloses Kontingent, darüber nach Zahl der PrüfungenDaten gehen an Google, meist ist eine Einwilligung im Cookie-Banner nötigScript von Google, Website-Schlüssel im Formular, geheimer Schlüssel auf dem Server
Friendly Captchader Anbieter, nachdem der Browser eine Aufgabe gerechnet hatkostenlos nur für kleine, nicht gewerbliche Seiten, sonst monatlicher Tarifohne Cookies, Anbieter in Deutschland, trotzdem ein Hinweis in der DatenschutzerklärungScript und Platzhalter im Formular, der Server fragt beim Anbieter nach
ALTCHAIhr eigener Server, nachdem der Browser eine Aufgabe gerechnet hatkostenlos, quelloffenkein fremder Dienst, wenn Sie das Widget-Script selbst ausliefernWidget-Script plus zwei kleine PHP-Teile, Bibliothek per Composer

Bei reCAPTCHA v3 sieht der Besucher nichts. Ihr Server bekommt von Google einen Wert zwischen 0,0 und 1,0, der angibt, wie menschlich der Besuch wirkte, und entscheidet selbst, ab welchem Wert er ablehnt; Google nennt 0,5 als Ausgangspunkt. Tarife und Freikontingente ändern sich, ein Blick in die aktuelle Preisliste des Anbieters gehört vor jede Entscheidung. Nutzt Ihre Seite sonst keine Google-Dienste, holen Sie sich mit reCAPTCHA einen Einwilligungsbanner ins Haus, den Sie ohne das Captcha nicht bräuchten.

ALTCHA in ein eigenes PHP-Formular einbauen

ALTCHA passt zu allen, die keinen fremden Dienst einbinden wollen und ein wenig PHP nicht scheuen. Der Einbau in ein vorhandenes Kontaktformular läuft in vier Schritten:

  1. Die Bibliothek mit composer require altcha-org/altcha installieren und einen langen, zufälligen geheimen Schlüssel festlegen, der nur auf dem Server steht.
  2. Eine kleine PHP-Datei anlegen, etwa captcha-aufgabe.php. Sie erzeugt mit der Bibliothek eine Aufgabe mit Ablaufzeit, signiert sie mit dem Schlüssel und gibt sie als JSON aus. Die Lösung steht nicht darin.
  3. Das Widget-Script auf den eigenen Server legen, einbinden und ins Formular <altcha-widget challengeurl="captcha-aufgabe.php"></altcha-widget> setzen. Der Browser rechnet beim Ausfüllen, ein Häkchen zeigt das Ende an. Das Ergebnis landet im versteckten Feld altcha.
  4. Beim Absenden prüft der Server $_POST['altcha'] mit demselben Schlüssel: Signatur, Rechenergebnis und Ablaufzeit. Bereits benutzte Aufgaben merkt er sich bis zu deren Ablauf, sonst ließe sich eine einmal gelöste Aufgabe mehrfach schicken.

Hier zeigt sich eine Spielart des Prinzips aus der ersten Grafik. ALTCHA legt die Lösung nicht in der Sitzung ab, sondern signiert die Aufgabe. Fälschen kann ein Bot sie trotzdem nicht, ihm fehlt der Schlüssel. Die Regel „jede Lösung nur einmal“ setzt aber erst Ihr Code aus Schritt 4 durch.

Warum das Bildergalerie-Script kein Captcha braucht

Das Bildergalerie-Script bringt kein Captcha mit, und es braucht auch keines. Die Galerie enthält für Besucher kein einziges Formular. Es gibt keine Kommentare, keine Bewertungen, kein Kontaktformular und keine Registrierung für Besucher. Besucher sehen Kategorien, Vorschaubilder und die große Ansicht in der Lightbox, absenden können sie nichts. Ein Captcha hätte dort nichts zu bewachen.

Das einzige Formular ist die Anmeldung zur Verwaltung im Ordner admin. Gegen automatische Rateversuche setzt das Script dort statt eines Captchas auf eine Anmeldesperre. Nach 5 Fehlversuchen innerhalb von 5 Minuten ist der Zugang gesperrt, gezählt getrennt je IP-Adresse und je Benutzername. Während der Sperre vergleicht das Script das Passwort gar nicht erst, sondern meldet „Zu viele fehlgeschlagene Anmeldeversuche. Der Zugang ist für 5 Minuten gesperrt. Bitte versuchen Sie es danach erneut.“ und schreibt „Zugang gesperrt“ ins Systemprotokoll. Solche Versuche verlängern die Sperre nicht. Wie das bei einem Bot aussieht, der ununterbrochen probiert, zeigt die zweite Grafik.

Animiertes Zeitdiagramm: Ein Bot probiert zehn Minuten lang Passwörter an der Anmeldung des Bildergalerie-Scripts, nach je 5 Fehlversuchen folgt eine Sperre, höchstens 60 Prüfungen je Stunde und 1.440 am Tag
Fünf Versuche, dann Pause: Die Anmeldesperre begrenzt einen Bot auf 1.440 Passwortprüfungen am Tag.

Die Rechnung dahinter: Höchstens 5 Prüfungen in jedem Zeitraum von 5 Minuten ergeben 60 in der Stunde und 1.440 am Tag für einen Benutzernamen. Wechselt der Bot seine IP-Adresse, hilft ihm das nicht, denn die Sperre je Benutzername gilt unabhängig davon. Ein Passwort aus 8 zufälligen Kleinbuchstaben und Ziffern hat 36 hoch 8, also rund 2,8 Billionen Möglichkeiten. Um alle durchzuprobieren, bräuchte der Bot bei diesem Tempo über fünf Millionen Jahre. Ein Captcha würde Sie dagegen bei jeder eigenen Anmeldung ausbremsen, die Sperre merken Sie nur, wenn Sie sich fünfmal hintereinander vertippen.

Einen Haken hat die Sperre: Wer Ihren Benutzernamen kennt, kann Sie mit Absicht immer wieder für 5 Minuten aussperren. Wählen Sie deshalb im Installer einen Benutzernamen, der nicht „admin“ lautet und nirgends öffentlich steht. Wer den Login zusätzlich abschirmen will, legt im Kundenmenü des Webhosters einen Verzeichnisschutz vor den Ordner admin, dann fragt der Server schon vor dem Script nach einem zweiten Passwort. Hat Ihre übrige Website ein Kontaktformular oder ein Gästebuch, entscheiden Sie dort nach den Überlegungen von oben, ob die Feldfalle reicht oder ein Captcha gegen Spam-Einträge nötig wird. Die Galerie selbst lässt sich kostenlos herunterladen und kommt ohne Captcha und ohne fremde Dienste aus.

Häufige Fragen

Diese Fragen kommen am häufigsten, wenn es um den Schutz eines Formulars geht.

Wofür steht die Abkürzung CAPTCHA eigentlich?

Für Completely Automated Public Turing test to tell Computers and Humans Apart. Gemeint ist ein Test, den ein Computer ohne menschliche Hilfe stellt und auswertet, um Menschen von Programmen zu unterscheiden. Der Name spielt auf den Turing-Test an, bei dem umgekehrt Menschen eine Maschine prüfen.

Welche modernen Captcha-Verfahren gibt es heute?

Verbreitet sind Verhaltensprüfungen wie Google reCAPTCHA und hCaptcha, außerdem Verfahren, bei denen der Browser eine kurze Rechenaufgabe löst. Daneben steht der Honeypot, streng genommen kein Captcha, sondern ein verstecktes Feld. Wer einen externen Anbieter einbindet, muss das in der Datenschutzerklärung erwähnen, weil dabei Daten des Besuchers an dessen Server gehen.

Welches Captcha gegen Spam-Mails passt zu einem kleinen Kontaktformular?

Zunächst gar keines: Feldfalle und Mindestzeit halten die meisten Bots auf und stören niemanden. Reicht das nicht, ist ALTCHA auf dem eigenen Server die naheliegende Wahl, weil keine Daten an einen fremden Dienst gehen und keine Kosten entstehen. Wer nichts programmieren möchte, nimmt Friendly Captcha. reCAPTCHA passt vor allem dann, wenn die Seite ohnehin Google-Dienste mit Einwilligung nutzt.

Hat das Bildergalerie-Script ein Captcha für Kommentare?

Nein. Das Script hat keine Kommentarfunktion und für Besucher überhaupt kein Formular, also auch kein Captcha. Die Anmeldung zur Verwaltung schützt es mit einer Sperre von höchstens 5 Minuten nach 5 Fehlversuchen, gezählt je IP-Adresse und je Benutzername.

Verwandte Themen

Zum Schutz von Formularen und zu den Pflichten, die ein eingebundener Dienst mit sich bringt, passen diese Seiten.