Notes

Captcha und Kopfrechnen

originally published online at raspunicum.de in 2006

Captcha ist ein Akronym für Completely Automated Public Turing-Test to Tell Computers and Humans Apart - wörtlich Vollautomatischer öffentlicher Turing-Test, um Computer und Menschen zu unterscheiden. Captchas werden verwendet, um zu entscheiden, ob das Gegenüber ein Mensch oder eine Maschine ist. Mit einem idealen Captcha kann man also beispielsweise sicherstellen, dass Formulare nicht von Spamrobotern ausgefüllt und abgesendet werden.

Oft wird ein Bild generiert, das verzerrte Buchstaben zeigt, die dann vom Benutzer in ein Formularfeld eingegeben werden müssen. Diese Methode ist die am meisten verbreitete, da es für Maschinen sehr aufwändig - wenn nicht gar unmöglich - ist, verzerrte Zeichen zu erkennen. Doch es gibt auch einen großen Nachteil dieser Art Captcha: Sehbehinderten Menschen ist es unmöglich, den Test zu lösen. Auch Benutzer von Nur-Text-Browsern werden ausgeschlossen.

Die Spamindustrie hat auch bereits einen Weg gefunden, diese Tests zu umgehen. Dazu wird die Captcha-Grafik Menschen zum Lösen gegeben und mit dieser Lösung wird das ursprüngliche Formular abgesendet. Die Menschen werden beispielsweise zur unentgeltlichen Lösung des CAPTCHA gebracht, indem Seiten mit vermeintlich kostenlosen pornografischen Inhalten angeboten werden, auf denen dann zuerst ein Captcha gelöst werden muss, um zum Inhalt zu gelangen.

Zudem hat sich bereits ein weiterer Schwachpunkt der Grafiktests gezeigt: Menschlichen Spamern ist es leicht möglich, diese zu lösen.

Die Probleme der Captchas für Sehbehinderte kann man auf einfache Art lösen und auch dem menschlichen Spamer kann man vielleicht mit der folgenden Methode einen zusätzlichen Stein in den Weg legen: Statt der verzerrten Zeichen auf Bildern stellt man dem Benutzer eine (leichte) Rechenaufgabe. Das hat den zusätzlichen Vorteil, dass der Benutzer seine Fähigkeiten im Kopfrechnen trainiert.

Dass ein Spamer den Captcha ausliest und einem Menschen zur Lösung stellt, kann aber auch damit nicht verhindert werden.

<?php
$zahl = array("1","2","3","4","5"); // Menge von Zahlen
$oper = array("+","-"); // Menge von Operanden
shuffle($zahl); // Array mischen
shuffle($oper); // Array mischen
$z1 = $zahl[0]; // eine Zahl 1 auswählen
$z2 = $zahl[1]; // eine Zahl 2 auswählen
$o = $oper[0]; // einen Operanden auswählen
if($_SERVER['REQUEST_METHOD']=='POST' && $_POST['button']=='senden') // Formular wurde abgesendet
{
if($_POST['o']=='+') // Addition
{
if(bcadd($_POST[z1],$_POST[z2])==$_POST['captcha']) $ok=1;
else $ok=0;
}
if($_POST['o']=='-') // Subtraktion
{
if(bcsub($_POST[z1],$_POST[z2])==$_POST['captcha']) $ok=1;
else $ok=0;
}
if($ok==1) echo "Ergebnis korrekt.";
elseif($ok==0) echo "Ergebnis falsch.";
}
else // CAPTCHA-Formular
{
echo "<form action='".basename($_SERVER['PHP_SELF'])."' method='post'>";
echo $z1." ".$o." ".$z2." = <input type='text' name='captcha'/>
“;
echo “<input type=’hidden’ name=’o’ value=’”.$o.”‘/><input type=’hidden’ name=’z1′ value=’”.$z1.”‘/><input type=’hidden’ name=’z2′ value=’”.$z2.”‘/>”;
echo “<input type=’submit’ name=’button’ value=’senden’/>”;
echo “”;
}
?>