HSG |
|
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).
Das folgende Skript kann über schule.hsg-kl.de/~mk/cgi-bin/hw.py aufgerufen werden.
#!/usr/bin/python
print 'Content-Type: text/html'
print
print
print '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"'
print '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>'
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.
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" <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" <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> """
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" <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> """
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" <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> """
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'
Entwickle ein elektronisches Abstimmungssystem, das sicherstellt, dass nur 'eingetragene Wähler' und diese nur einmal abstimmen können.
ja 23 nein 8aufruft, eine Entscheidung abfragt, die Datei aktualisiert und den momentanen Stand ausgibt.