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?

Freitag, 15. August 2008

SQL-Dump zerlegen


SQL-Dumps kommen üblicherweise als Textfile daher. Und haben häufig die unangenehme Eigenschaft, riesig zu werden. Dieser Beitrag stellt ein kleines Python-Script vor und zur Verfügung, mit dem sich der Dump einer MySQL-Datenbank in mehrere Dateien zerlegen lässt, die jeweils nur noch die Daten einer einzelnen Tabelle enthalten. Eine MySQL-Datenbank mit all ihren Tabellen lässt sich etwa so prima exportieren:

mysqldump --opt -h 127.0.0.1 -u DBUSER -pDBPASSWD DATABASE >dump.sql

Was aber tun, wenn 'dump.sql' viel größer als gewünscht ist? Nun, zerlegen wir die Datei doch in kleinere Häppchen. Das lässt sich per Hand mit einem Editor bewältigen, ist dann aber schnell Sklavenarbeit und dazu noch fehleranfällig. Dann lieber ein Tool nehmen, dass diese Arbeit maschinell erledigt. Vermutlich gibt es dieses Tool bereits zuhauf - ich habe nicht danach gesucht. Wer so ein Tool kennt möge mir doch eine Zeile schreiben.

In meinem Fall hatte ich nicht die große Allround-Lösung im Sinn. Auch habe ich mich nicht damit beschäftigt, welche syntaktischen Klimmzüge das Programm da bei den Kommentaren im Dump hinterlässt. Vielmehr habe ich ein Tool geschrieben, dass mir genau die Arbeit abnimmt, die ich sonst per Hand gemacht hätte: Database-Dump nehmen, jeden Abschnitt daraus, der eine Tabelle enthält, in eine eigene Datei stecken, die 'tabellenname.sql' heißt, und dafür sorgen, dass auch hier die Kommentare am Anfang und am Ende der Datei wieder vorhanden sind.

So ist splitsql.py entstanden, ein Python Opensource Programm, das beliebig verwendet werden darf. Beispieldaten kann man sich hier anschauen. Was Spaß macht: Es lässt sich leicht modifizieren, und so ist es nicht schwer, ihm beizubringen, zusätzliche Informationen auszugeben, wie etwa die Vorlage für ein Shellscript oder Texte, die man wieder in den Quelltext einbauen kann. Viel Spaß!

Donnerstag, 7. August 2008

The One Line Webserver

It can be so easy - once you know. A lot of people do some web development at home. Beginners reach a major frontier once they leave the terrain of pure (X)HTML and CSS. For instance dealing with AJAX in general requires a web server. Mostly you'll find the advice to install one of those great all-in-one packages like XAMPP from apachefriends or to turn to Linux right away. And this is where you'll surely end if you follow your web developer career. But there may be a lot of reasons why you wouldn't want to follow this lane and prefer an inobtrusive and small solution to start with.

All right, here it comes. I'm talking of Windows here. But the solution is applicable to other operating systems as well (if it's needed there at all ...). My advice is to install Python on your machine. This is just a matter of a few clicks once you have grabbed the complete installer package from the download page of python.org. Currently version 2.5.2 is what you should choose. It will propose to install to C:\Python25 which you should do. Make sure that this folder is added to your path. Installing Python isn't a danger or risk. It doesn't bloat your system and can be easiely removed using the uninstaller. But you'll never feel the need to do so.

Now create a folder as the root of your webserver and a subfolder where you put your documents. Let's say we now have ".../MyServer/htdocs". Create a file "MyServer/htdocs/helloworld.txt" with "Hello World!" as content. Open a command line window and navigate to the "MyServer/htdocs" folder. And one single command gets your web server on your local machine up and running:

C:\MyServer\htdocs> python -m CGIHTTPServer

Serving HTTP on 0.0.0.0 port 8000 ...

WARNING: Do not start this server while you're connected to an untrustable net - like the internet - as it may expose your complete machine. Do local testing only!

What basically happens is that you start Python which will look for a python module CGIHTTPServer. The module will then be imported and as it finds out that it's running as a main module it activates "a little test routine" which will run forever until you press CTRL+C and the next http-request is encountered. The "little test routine" in fact is a complete webserver with some abilities. Do the test:

http://localhost:8000/helloworld.txt

and "Hello World!" is what you should see in the browser. You've tasted blood and would like to try some serverside active scripting? That's easy. Add a second folder named 'htdocs/cgi-bin' and place a little text file called "helloworld.py" there. It contains a single line:

print "Hello World!"


So now you have:

MyWebserver/ <- just to organize everything
MyWebserver/htdocs <- your webspace! start server here.
MyWebserver/htdocs/cgi-bin <- place Python scripts here
MyWebserver/htdocs/helloworld.txt
MyWebserver/htdocs/cgi-bin/helloworld.py

Now open this URL in your browser:

http://localhost:8000/cgi-bin/helloworld.py

You got this?
Congratulations!


Python will start helloworld.py as a CGI-script and direct all output to your web page. Amazing, isn't it? There won't be PHP and MySQL unless they already existed on your machine. But Python programmers will now have hundreds of ideas of how to inspect and extend the code. You aren't a Python programmer? Well, become one! It's more than advisable!

extra key words: "poor man's web server"

Dienstag, 15. Juli 2008

TYPO3: Voll im Thema


Zweiter Montag im Monat, es war wieder soweit: Die TYPO3-ug-muenster hat sich getroffen. Ich würde mal so sagen: Ein voller Erfolg. Trotz Ferienzeit sieben Leutchen da, nette Atmosphäre, und wie immer, selbstverständliche Neuigkeiten und neues Selbstverständliches. Das nennt man Anregung. Was der eine nicht weiß, ahnt zumindest der andere. Na gut, manchmal auch nicht, aber das liegt in der Natur der Sache. Die Website zum Thema: typo3ugms.de. Wir haben eine eigene Mailingliste, und was wir untereinander per Mail besprechen läuft hier durch. Dort kann man auch im Archiv nachlesen. Es ist eine Riesenvorteil, dass darin alle Infos gespeichert bleiben und nichts verloren geht. Ein prima Langzeitgedächtnis also. Wer mal schnell sehen will, was los ist, kann das auch hier tun. Ich hoffe, diese typo3.org-Adresse bleibt.

Tipp: Die Mailingliste ist auch als Newsgroup verfügbar! Und es ist am besten, sie mit einem Newsreader zu lesen. Der fragt nach dem Host-Namen des Newsservers, und die lautet: news.netfielders.de. Wie das mit der Newsreader-Einstellung geht, findet man kompakt auf individual.de. Häufig benutzt wird Mozilla Thunderbird. Unter Windows empfiehlt sich der Agent. Meine Erfahrung: Er ist sein Geld Wert! In der Variante als FreeAgent war er bis zur Version 3.x kostenlos und auch sehr gut nutzbar.

Parallel bin ich auch in der Mailingliste eingetragen. So erhalte ich eine Mail, wann immer jemand etwas postet. Zum Lesen und Schreiben benutze ich dann wieder den Newsreader. Dann stimmt die Nachrichtenverkettung, und ich habe alle Nachrichten Newsreader vorrätig. Das ist besser als jede Websuche!

Sonntag, 13. Juli 2008

Knoten in der DSL-Leitung oder was?


Letzten lag bei meinem Provider fast einen Tag lang eine "Großstörung" vor und nichts ging mehr in Sachen DSL und Internet. Kein Wunder, dass ich den gleichen Verdacht hatte, als letzte Woche partout kein Datenpaket eintrudeln wollte. Diesmal war es jedoch anders: Der Router hatte sich eingewählt, und die Linux-Maschine schnurrte wie gewünscht. Dann fiels mir ein: Ach ja, gestern war Windows-Patchday. Einer Ahnung folgend: ZoneAlarm deaktiviert, und siehe da: Es ging wieder.

Nett, (oder Selbstschutz), von meinem Provider kam eine Infomail, dass durch "Einspielen des neuesten Microsoft-Updates (KB951748) in Kombination mit dem Security-Programm ZoneAlarm" es zu Störungen beim Internetverkehr kommt. Na, das ist doch mal eine Info. Warten wir also ab, bis der Patch zum Patch da ist oder ZoneAlarm angepasst wurde, so dass sich beide wieder vertragen.

Hhm, das ging ja schnell: Hier sind sie schon, Aufklärung und Workaround. Noch besser: Jetzt auch in deutscher Sprache.

Freitag, 11. Juli 2008

Neues vom Eszett: Jetzt gibt's das S nicht nur scharf, sondern auch groß


In meinem Ausweis steht Bleß. Aber auch Bless. Was gilt denn nun wann? Und längst nicht jeder auf der Welt weiß mit diesem "ß" etwas anzufangen. Was hat es mit diesem seltsamen Buchstaben auf sich? Schau nach: ß in Wikipedia. Seit 130 Jahren wird darüber diskutiert, ob es nicht auch eine Form dieses Buchstabens in großer Schreibweise, also in Versalien geben solle. Nun ist es soweit: In ISO-10646 und Unicode 5.1 ist er jetzt enthalten und somit technisch - als Zahlenwert - schon einmal definiert. U+1E9E ist sein Unicodewert (Wikipedia über das große ß). Bleibt die Frage, wie lange es dauern wird, bis die Schriftdesigner für dieses Symbol auch eine Glyphe finden, die sich ausreichend von ß,S,B unterscheidet. Und wie lange es dauern wird, bis diese dann Einzug in die Fontdateien hält. Zur Zeit ziehen da bei mir nur Fragezeichen auf - siehe Abbildung. Tipp: Ausgesprochen nützlich ist www.utf8-zeichentabelle.de. Diese Webanwendung hilft bei der Recherche im Lande Unicode.

Mittwoch, 9. Juli 2008

Blogstart

Jetzt hat's also auch mich erwischt. Wie's aussieht, ist ein Leben ohne Permanentnotizen ja kaum noch führbar - zumindest, wenn man sich in der Infoflut der Informationstechnologien tummelt. Gehen wir's also an: Hier ist ein Blog. Der, die, das? Jedenfalls meins, meiner, meine! Mal sehen, was sich damit so treiben lässt.