Donnerstag, 13. November 2008

Kein Captcha? Gotcha!

Was tun, wenn ein Programm überhaupt nichts "sagt"? Dieser Beitrag zeigt Wege für ein systematisches Vorgehen im Gegensatz zum "Versuch und Irrtum".
Die Zeiten sind rauh, und wer seine Formulare nicht gegen Roboter sichert, wird leicht zum Verbreiter unerwünschter Inhalte. Captchas sind ein gängiges Verfahren. Und wenn der Anreiz nicht zu hoch ist, genügt schon eine einfache Erkennungsaufgabe wie diese , um Anfreifer fernzuhalten. Der gewiefte TYPO3-Installateur weiß was zu tun ist: Nehme die passende Extension, zum Beispiel 'captcha' und fertig. Tatsächlich? In diesem Fall leider nicht. Nichts zu sehen. Keinerlei Bild. Und dann ist er wieder da, der Moment, wo von Lernkurve nicht mehr die Rede ist. Eher befindet sich da eine Steilwand voraus, wenn nicht gar ein Überhang. Was kann man tun?

Ausrüstung: Systematische Analyse ist das Mittel der Wahl. Und um den Dingen wirklich auf den Grund gehen zu können braucht man vollen Zugriff auf den Server. Zu Test- und Entwicklungszwecken habe ich deshalb auch ein Ubuntu-Linux unter meinem Schreibtisch. In diesem Fall ist es 8.04, "Hardy Heron". Und da es nur lokal verfügbar ist, brauche ich den Zugriff nicht einzuschränken, um höhere Sicherheit zu erhalten. Im Gegenteil: Für Testzwecke sind eher liberale Einstellungen nützlich. So verwende ich auch einfach die vorhandene /etc/php5/apache2/php.ini, wohl wissend, dass diese so in einer Produktionsumgebung nicht verwendet werden darf. In der Minimalvariante ist es nicht nötig, einen lokalen Nameserver zu betreiben. Die Windows XP zum Beispiel schlägt Webadressen auch in der lokalen HOSTS-Datei C:\WINDOWS\system32\drivers\etc\hosts nach, um die IP-Nummer herauszufinden. So genügt die Zeile
192.168.1.100 www.mylinux.lokal
um http://www.mylinux.lokal als Server ansprechen zu können. Die IP-Nummer muss natürlich richtig gewählt sein. Ausgesprochen praktisch ist es, wenn man das Webverzeichnis zusätzlich auch über Dateifreigaben ansprechbar macht. So bindet der Linuxdienst Samba Dateien ins Windowsnetz ein.

Dem Fehler auf der Spur: Ist meine TYPO3-Konfiguration überhaupt richtig? Wird 'captcha' überhaupt angesprochen? Fast alle Entwickler verwenden den Firefox als Browser. So auch ich. Und Strg+U öffnet den Quelltext: Tatsächlich, ein Bild ist als <img src="typo3conf/ext/captcha/captcha/captcha.php"> eingebunden. Erscheint aber nicht. Auch nicht unter http://www.mylinux.lokal/typo3conf/ext/captcha/captcha/captcha.php
Schauen wir uns also captcha.php an. Hier und dort eine Zeile echo 'hi'; und echo 'ho'; eingefügt und wir sehen, an welcher Stelle das Problem liegt. Bis zur Zeile
$rot = imagerotate($tmpi, 0, $back);
geht alles gut, danach hören wir keinen Pieps mehr. Was ist so schlimm an 'imagerotate'? Wenn es doch ansonsten funktioniert? Schauen wir doch mal in die PHP-Logdatei. Sollte doch unter /var/log/... liegen. Keine da. Also: Logfile in die php.ini eintragen und mit /etc/init.d/apache2 restart den Server neu starten. Und siehe da, gotcha! Im nun neu auftauchenden PHP-Error-Log findet sich:
PHP Fatal error: Call to undefined function imagerotate() in ...
Undefined function? Warum gibt es 'imagerotate' nicht? Hier hilft nur Googeln. Und siehe da: Jede Menge Treffer. Wir sind nicht allein. Aber jetzt heißt es 'aufgepasst' und den gesunden Menschenverstand eingeschaltet. Da gibt es viele Anleitungen, wie man sich die fehlende Funktionalität in sein Ubuntu-PHP wieder 'hineintricksen' kann. Aber genau das sollte man nicht tun. Die Ubuntu-Entwickler und mehr noch, bereits das Debian-Team haben absichtlich Funktionalitäten der GD-Lib ausgelassen. Sie waren aus Sicherheitsgründen dazu gezwungen. Also müssen wir damit leben. Was tun? Erneuter Blick in den captcha.php-Quelltext. Da gibt es noch eine Variante, die kein imageroate() verwendet und aktiv ist, wenn useTTF eingeschaltet ist. Und dieses lässt sich im TYPO3-Extensionmanager aktivieren:
und
Und nun, siehe da: Das Captcha-Bild erscheint. Glück gehabt! Es gab nur diese eine 'imagerotate'-Klippe.

Fazit und was lernen wir daraus? 1. Eine gute Testumgebung ist Gold wert. 2. Raten, Googeln und Fragen in den Newsgruppen von news://news.netfielders.de hätten vielleicht niemals zum Ziel geführt. 3. Ruhig, schrittweise und analytisch vorgehen. 4. Debugtools einschalten und nutzen. 5. Manches hat seinen Grund: Nicht leichtfertig vermeintliche Fehler 'reparieren', handelte es sich in unserem Fall doch um bewusste Entscheidungen ganzer Sicherheitsteams! 6. Den eigenen Produktionsserver daraufhin überprüfen, ob sein PHP imagerotate enthält. Das wäre zwar praktisch, aber ein Sicherheitsproblem! 7. Beim captcha-Einsatz useTTF einschalten. 8. Beizeiten nach anderen Captcha-Extensions Ausschau halten, die diese Problematik vielleicht nicht haben. Etwa sr_freecap?