Python Material Installation Dokumentation PythonKara Grundlagen Namensräume Funktionen Testen Strings Dictionary Listen Zeitmessungen Zufall Bits+Bytes Module Sockets xml serielle Schnittstelle Python in HTML Turtle xturtle Tkinter OOP Threads Zusicherungen exe Patterns GnuPlot Goto MySQL CGI Dateien Exceptions Grafik Mathematik Fischertechnik Unicode funktional Iterator Sound C Debugger regex Pfade Docstrings Django Bluetooth format Bytecode signal
Pfad: Startseite / Fächer / Informatik / Python / CGI
Autor: mk
25.03.2009 18:33
2732
CGI

CGI-Skripte sind Programme, die über das Internet mit Hilfe eines Web-Browsers gestartet werden können. Wenn der Webserver entsprechend konfiguriert ist, so können das auch Python-Skripte sein. Gewöhnlich liegen CGI-Scripte im Verzeichnis /cgi-bin. Die ersten Zeilen eines Skripts haben eine Sonderbedeutung. Die erste Zeile gibt den Pfad zu dem Python-Interpreter an. Die zweite Zeile gibt den sogenannten Header des HTTP-Pakets an. er gibt z.B. den Typ der Information an. Die beiden folgenden Zeilen beenden den Header. Sie können natürlich auch durch die Ausgabe von \n\n ersetzt werden. In der Regel wird man einem hochgeladenem Skript mit Hilfe des ftp-Programms die richtigen Zugriffsrechte geben müssen. Der Besitzer erhält alle Rechte, alle anderen Leserecht und Ausführrecht (755).

chmod

Das folgende Skript kann über schule.hsg-kl.de/~mk/cgi-bin/hw.py aufgerufen werden.

Hallo Welt!


#!/usr/bin/python
print 'Content-Type: text/html'
print
print
print '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"'
print '"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'
print '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de">'
print '<head>'
print '<title>cgi-Demo</title>'
print '<meta name="author" content="mk" />'
print '<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />'
print '</head>'
print '<body>'
print
print '<p>Hallo Welt!</p>'
print
print '</body>'
print '</html>'

Das Datei-Format-Problem

Text-Dateien werden je nach Betriebssystem unterschiedlich gespeichert. Es gibt Dos-Style, Unix-Style und Mac-Style. Der Unterschied besteht darin, wie eine neue Zeile kodiert wird. Unix verwendet nur das Zeichen \n newline, Dos/Windows verwendet zwei Zeichen \r\n carriage-return+newline, Mac-OS verwendet nur \r carriage-return. Viele ftp-Programme konvertieren beim Hochladen aus dem Dos-Style in den - oft notwendigen - Unix-Style. Der Benutzer ist zufrieden und merkt nichts von dem Problem. Sollte das nicht klappen, so braucht man einen geeigneten Editor, um im notwendigen Style zu speichern. Der freie Editor gVim ist zum Beispiel geeignet.

Datei-Format

Verarbeitung eines HTML-Formulars

Eine Eingabe-HTML-Datei - die nicht in /cgi-bin liegen darf - könnte folgendermaßen aussehen:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de">
<head>
<title>Informatik - Python - CGI - Formular</title>
<meta name="author" content="mk" />
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
</head>

<body>
<form action="../cgi-bin/verarbeite.py" method="post">
<pre>
Vorname: <input type="text" name="vorname" size="15" />
   Name: <input type="text" name="name" size="15" />
         <input type="submit" value="Login" />
</pre>
</form>
</body>
</html>

Die Datei verarbeite.py könnte so aussehen:

#!/usr/bin/python
import cgi
form = cgi.FieldStorage()
vorname = form.getvalue('vorname')
name = form.getvalue('name')
print 'Content-type: text/html\n\n'

print """
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de">
<head>
<title>Informatik - Python - CGI - Formular-Verarbeitung</title>
<meta name="author" content="mk" />
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
</head>

<body>
"""
print '<h3>Herzlich willkommen,',vorname,name,'!</h3>'
print """
</body>
</html>
"""

CGI-Skripte debuggen

Ein fehlerhaftes CGI-Skript gibt keine Fehlermeldungen über den Browser aus. Das kann man mit dem Modul cgitb ändern. Teste folgendes Skript cgitbTest.py

#!/usr/bin/python
import cgitb
cgitb.enable()
del xx
print 'Content-type: text/html\n\n'

print """
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de">
<head>
<title>Informatik - Python - CGI - Formular-Verarbeitung</title>
<meta name="author" content="mk" />
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
</head>

<body>
<h3>cgitb-Test</h3>
"""
print '<p>',xx,'</p>'
print """
</body>
</html>
"""

Aufgaben

Login mit Passwort-Überprüfung

Anhand einer Passwortdatei, z.B.

egon geheim
fritz kraut
susi ratlos

wird der eingegebene Username und das eingegebenen Passwort überprüft.

Welches Sicherheitsrisiko besteht?

#!/usr/bin/python
import cgi, cgitb
cgitb.enable()

form = cgi.FieldStorage()
user = form.getvalue('user')
passwd = form.getvalue('passwd')

datei = open('passwort.txt')   # 'r' wird automatisch angenommen
pw = datei.read().split('\n')
datei.close()

login = False
for z in pw:
    [pwuser,pwpasswd] = z.split(' ')
    if (user == pwuser) and (passwd == pwpasswd):
        login = True
if login:
    meldung = user+' hat sich authentisiert!'
else:
    meldung = user+' konnte nicht authentifiziert werden!'


print 'Content-type: text/html\n\n'

print """
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de">
<head>
<title>Informatik - Python - CGI - Login-Verarbeitung</title>
<meta name="author" content="mk" />
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
</head>

<body>
"""
print '<p>',meldung,'</p>'
print """
</body>
</html>
"""

Aufgabe

Verbessere das Programm durch Verwendung einer kryptologischen Hashfunktion.

Hilfe:

>>> import hashlib
>>> m = hashlib.md5()
>>> m.update('Franz jagt im komplett verwahrlosten Taxi quer durch Bayern')
>>> m.hexdigest()
'a3cca2b2aa1e3b5b3b5aad99a8529074'

Experimente

Aufgabe

Entwickle ein elektronisches Abstimmungssystem, das sicherstellt, dass nur 'eingetragene Wähler' und diese nur einmal abstimmen können.

Teilaufgaben

Links

Valid XHTML 1.0!