View
216
Download
0
Category
Preview:
Citation preview
CGI-Programmierung
Fachhochschule WiesbadenFachbereich Design-Informatik-Medien Prof. Dr. Weber
15. Dezember 2008
Alexander Petitjean - Alexander.Petitjean@YMail.comYelena Kolpakova - Yelena.K@gmx.de
Überblick
2
Kapitel I Einführung CGI1. CGI 2. CGI Geschichte3. CGI - Worum geht es ?4. CGI - Skript5. HTTP6. CGI Ablauf7. CGI Environment8. CGI - Konsequenzen9. CGI - Sicherheitsfragen10. CGI - Alternativen
(c) Alexander Petitjean / Yelena Kolpakova (FH-Wiesbaden) Liste V - Systemprogrammierung - Vortrag CGI Programmierung
Überblick
3
Kapitel II Praxis - Das Projekt1. Worum geht es ?2. Projektaufbau3. Mögliche Sprachen4. Warum Ruby ?5. Debugging6. Programmablauf7. DEMO
(c) Alexander Petitjean / Yelena Kolpakova (FH-Wiesbaden) Liste V - Systemprogrammierung - Vortrag CGI Programmierung
Überblick
4
Literatur/Quellen:• Jetzt lerne ich CGI [Rafe Colburn]• Objektorientiere Programmierung mit Phython [Michael
Weigend]• CGI Programmierung mit Pearl [O‘REILLY]• http://www.informatik.fh-wiesbaden.de/~werntges/• http://stdlib.rubyonrails.org/• http://httpd.apache.org/docs/2.2/howto/cgi.html
(c) Alexander Petitjean / Yelena Kolpakova (FH-Wiesbaden) Liste V - Systemprogrammierung - Vortrag CGI Programmierung
Kapitel 1
5(c) Alexander Petitjean / Yelena Kolpakova (FH-Wiesbaden) Liste V - Systemprogrammierung - Vortrag CGI Programmierung
1. CGI ?
6
• Common Gateway Interface = Allgemeine Vermittlungsschnittstelle• Gateway/Schnittschnelle zwischen WebServer und externem Programm / Umgebung
(c) Alexander Petitjean / Yelena Kolpakova (FH-Wiesbaden) Liste V - Systemprogrammierung - Vortrag CGI Programmierung
2. CGI Geschichte
7
• erster WebServer war NCSA HTTPD• NCSA (National Center for Supercomputing
Applications (Gründer von Netscape / „Mosaik“)• wichtigste Funktion war CGI• CGI auch in CERN Web Server enthalten (1994)• Anfangs einzigste Möglichkeit für „Web
Applikationen“• Offener Quellcode von NCSA HTTPD führt zur
Implementierung in alle anderen WebServer
(c) Alexander Petitjean / Yelena Kolpakova (FH-Wiesbaden) Liste V - Systemprogrammierung - Vortrag CGI Programmierung
3. Worum geht es ?
8
• Abruf „statischer“ Dokumente genügt nicht• statische Ressource = keine Veränderung
zwischen 2 Aufrufen: HTML Datei, Bild• dynamische Ressource = kann sich zwischen 2
Aufrufen ändern: Abhängig von Bedingung(Benutzereingabe, Benutzerrolle) u. Zugriff auf Datenquellen (Routenplaner, Wetterdienst, etc.)
• Daten sollen eingegeben, verarbeitet und ausgegeben werden
• dynamische Elemente: Formulare, Middleware/Business Logik
(c) Alexander Petitjean / Yelena Kolpakova (FH-Wiesbaden) Liste V - Systemprogrammierung - Vortrag CGI Programmierung
4. CGI Script
9
• CGI Scripte sind zunächst Programme die über das Internet gestartet werden
• Werden über Web Browser wie HTML Dokumente durch Eingabe einer URL gestartet
• URL = uniform ressource locator• URL: HTTP: //www.website.de/dokument.html• URL: HTTP: //www.website.de/cgi-bin/prg.cgi• PROTOKOLL :// DOMAIN / PFAD ZUR DATEI
(c) Alexander Petitjean / Yelena Kolpakova (FH-Wiesbaden) Liste V - Systemprogrammierung - Vortrag CGI Programmierung
4. CGI Script
10
• 1. Eingabe einer URL -> Anfrage von Dokument an Domain über Internet an HTTP Server
• 2. HTTP Server nimmt Anfrage entgegen• - bei HTML Dokument: Server schickt Inhalt von
HTML Datei in einem HTTP Paket zurück an Client
• - bei „Dokument=CGI Skript“: Server startet CGI Prozess, CGI Skript erzeugt nun HTTP Paket, gibt es an HTTP Server zurück, dieser leitet es an Client weiter
(c) Alexander Petitjean / Yelena Kolpakova (FH-Wiesbaden) Liste V - Systemprogrammierung - Vortrag CGI Programmierung
5. HTTP
11
• Browser Request und Server Response• Request/Response haben Header u. optional Body• Header: enthällt META Informationen• Body: enthällt Nachricht selbst
(c) Alexander Petitjean / Yelena Kolpakova (FH-Wiesbaden) Liste V - Systemprogrammierung - Vortrag CGI Programmierung
5. HTTP
12
• Beispiel: http://localhost/index.html:
(c) Alexander Petitjean / Yelena Kolpakova (FH-Wiesbaden) Liste V - Systemprogrammierung - Vortrag CGI Programmierung
GET /index.html HTTP/1.1HOST: localhostAccept: image/gif, image/jpeg, */*Accept-Language: enConnection: Keep-AliveUser-Agent: Mozilla/4.0
HTTP/1.1 200 OKDate: Sat, 18 Mar 2000 20:35:35 GMTServer: Apache/1.3.9 (UNIX)Last-Modified: Wed, 20 May 1998 14:59:42 ETag: „5657567976575“Content-Length: 161Content-Type: text/html
<HTML><HEAD Meine Titelzeile</HEAD><BODY>Dies ist ein Beispieltext</BODY></HTML>
CLIENT SERVER
6. CGI Ablauf
13
Quelle: Objektorientierte Programmierung mit Phython, M.W.
(c) Alexander Petitjean / Yelena Kolpakova (FH-Wiesbaden) Liste V - Systemprogrammierung - Vortrag CGI Programmierung
6. CGI Ablauf
14 Liste V - Enterprise JAVA - Vortrag zu JAVA Servlets
CLIENT
CLIENT
SERVER
SERVER
HTTP Request
HTTP Response
1. Server erkennt: URL für CGI2. Server filtert Header Zeilen3. Server setzt Umgebungsvariablen4. Server startet CGI Prozess (Fork/Pipe)
5. CGI ließt Daten v. STDIN u. Env.6. CGI Prozess schreibt Header und Body nach STDOUT7. Server ergänzt eventl. Header8. Server sendet HTTP Response an Client und beendet CGI Prozess
EnvironmentSTDIN
STDOUT
CGIProzess
(c) Alexander Petitjean / Yelena Kolpakova (FH-Wiesbaden)
7. CGI Enviroment
15
• 1. Unspezifische Variablen für alle Requests• 2. Request Abhängige Variablen• 3. Variablen für HTTP Header von Clients, die der
Server nicht als Standard ansieht,z.B. HTTP_ ... HTTP Server entscheidet ob durchgelassen wird
• 4. Sonderfälle
(c) Alexander Petitjean / Yelena Kolpakova (FH-Wiesbaden) Liste V - Systemprogrammierung - Vortrag CGI Programmierung
7. CGI Enviroment
16
• Unspezifische Variablen für alle Requests:• SERVER_SOFTWARE• SERVER_NAME• GATEWAY_INTERFACE
(c) Alexander Petitjean / Yelena Kolpakova (FH-Wiesbaden) Liste V - Systemprogrammierung - Vortrag CGI Programmierung
7. CGI Enviroment
17
• Request abhängige Variablen:• SERVER_PROTOCOL• SERVER_PORT• REQUEST_METHOD• REMOTE_HOST• REMOTE_ADDR• AUTH_TYPE• PATH_INFO• QUERY_STRING• CONTENT_TYPE• CONTENT_LENGTH (Länge des HTTP Body)
(c) Alexander Petitjean / Yelena Kolpakova (FH-Wiesbaden) Liste V - Systemprogrammierung - Vortrag CGI Programmierung
7. CGI Enviroment
18
• Variablen für HTTP HEADER von Clients:• HTTP_ACCEPT• HTTP_ACCEPT_CHARSET• HTTP_ACCEPT_ENCODING• HTTP_ACCEPT_LANGUAGE• HTTP_COCKIE (Paar aus Name/Wert Kombi.)• HTTP_FROM• HTTP_HOST (Zielrechner)• HTTP_USER_AGENT• HTTP_REFERER
(c) Alexander Petitjean / Yelena Kolpakova (FH-Wiesbaden) Liste V - Systemprogrammierung - Vortrag CGI Programmierung
8. CGI Konsequenzen
19
• CGI Anwendungen können praktisch mit allen Sprachen erstellt werden, Scriptsprachen sind hier sehr prakisch
• CGI Anwendungen stehen „hinter“ dem Server, erhalten nur durchgelassene Daten
• Jeder CGI Aufruf startet einen neuen Prozess ! Weiterer Overhead durch Sprache-Interpreter!
(c) Alexander Petitjean / Yelena Kolpakova (FH-Wiesbaden) Liste V - Systemprogrammierung - Vortrag CGI Programmierung
9. CGI Sicherheitsfragen
20
• CGI Anwendungen laufen oft auf kritischen Servern
• CGI Skript ermöglicht Programme auszuführen• CGI Skript ermöglichen Eingabe von „bösen“
Daten• CGI Prozess läuft unter dem HTTP-Server
Prozess, hat also Rechte von HTTP Server (Child-Prozess)
• HTTP-Server könnte Child Prozess anderem User zuordnen -> Root Rechte -> WebServer Lücke...
(c) Alexander Petitjean / Yelena Kolpakova (FH-Wiesbaden) Liste V - Systemprogrammierung - Vortrag CGI Programmierung
9. CGI Sicherheitsfragen
21
• Dringende Überprüfung von Dateneingaben• Überprüfung von Datei Rechten• Isolierte WebServer Umgebung (CGI-Umgebung)• WebServer -> User Authentifizierung
(c) Alexander Petitjean / Yelena Kolpakova (FH-Wiesbaden) Liste V - Systemprogrammierung - Vortrag CGI Programmierung
10. Alternativen zu CGI
22
• Java Server Pages / Active Server Pages• Java Servlets (code wird auf WebServer kompiliert)• PHP (Interpreter im Web Server eingebettet)• FastCGI (vorgehaltene Prozesse im Arbeitspeicher)• mod_cgi, mod_ruby, mod_XXX (Interpreter wird in
WebServer eingebunden)
(c) Alexander Petitjean / Yelena Kolpakova (FH-Wiesbaden) Liste V - Systemprogrammierung - Vortrag CGI Programmierung
Kapitel 2
23(c) Alexander Petitjean / Yelena Kolpakova (FH-Wiesbaden) Liste V - Systemprogrammierung - Vortrag CGI Programmierung
1. Worum geht es ?
24
• Entwicklung eines Programmiersprachen Servers• Ermöglicht „entfernte Kompilierung“• Senden von fertigem Quellcode als Datei• Eingabe von Quellcode auf Web Seite• Download von fertig kompiliertem Programm
(c) Alexander Petitjean / Yelena Kolpakova (FH-Wiesbaden) Liste V - Systemprogrammierung - Vortrag CGI Programmierung
2. Projektaufbau
25
• SERVER:• Betriebssystem: UBUNTU Linux• HTTP Server: APACHE 2• Zusatz: mod_ruby / mod_ssl• Über DYNDNS aus dem Internet verfügbar• CLIENT:• Betriebsystem: unabhängig• Web Browser: Firefox/Safari/Internet Explorer
(c) Alexander Petitjean / Yelena Kolpakova (FH-Wiesbaden) Liste V - Systemprogrammierung - Vortrag CGI Programmierung
3. Mögliche Sprachen
26(c) Alexander Petitjean / Yelena Kolpakova (FH-Wiesbaden) Liste V - Systemprogrammierung - Vortrag CGI Programmierung
Sprache KompilerC gcc
C++ g++Java javac
Pascal gpcFortran gfortran
4. Warum Ruby?
27
• vollständig objektorientiert• Kompakt, keine überflüssige Sprachelemente• dynamische Typisierung• Interpreter statt Compiler• automatische Speicherverwaltung• sehr umfangreiche API, u.a. für CGI• Ruby ist in C implementiert
(c) Alexander Petitjean / Yelena Kolpakova (FH-Wiesbaden) Liste V - Systemprogrammierung - Vortrag CGI Programmierung
5. Debugging
28
• Ruby Code Debugging in IRB Konsole• „Debugging“ sonst nur zur Laufzeit möglich• Fehler in STDERR -> /var/log/Apache2/error.log• Browser gibt nur allgemeine Fehlermeldung aus• Manuelles Debugging: cgi.out{ } oder puts• HTTP Sniffer Debugging (wireshark/tcpmon)
(c) Alexander Petitjean / Yelena Kolpakova (FH-Wiesbaden) Liste V - Systemprogrammierung - Vortrag CGI Programmierung
6. Programm Ablauf
29(c) Alexander Petitjean / Yelena Kolpakova (FH-Wiesbaden) Liste V - Systemprogrammierung - Vortrag CGI Programmierung
abgabe_formular.xhtml abgabe_fileupload.xhtml
anmeldung.xhtml
abgabe_ok_fileupload.xhtmlabgabe_ok_forumlar.xhtml
abgeben_formular.cgi abgeben_fileupload.cgi
anmelden.cgi
abgabe_archiv_fehler.xhtmlabgabe_compiler_fehler.xhtml
anmeldung_fehler.xhtml
6. Programm Ablauf
30(c) Alexander Petitjean / Yelena Kolpakova (FH-Wiesbaden) Liste V - Systemprogrammierung - Vortrag CGI Programmierung
<body><h1>Anmeldung</h1><form action="/cgi-bin/anmelden.cgi" method="post"> <p>Name:<br /> <input type="text" name="nachname" size="40" maxlength="40" /> </p> <p>Passwort:<br/> <input type="password" name="password"/> </p> <p>Wollen Sie CODE direkt eingeben oder ein file übersetzen lassen: <br/> <input type="radio" name="compiler_weg" value="formular" /> Code direkt eingeben <br/> <input type="radio" name="compiler_weg" value="fileupload" /> Datei übersetzen <br/> </p> <p> <input type="submit" value="Anmelden"/> <input type="reset" value="Löschen"/> </p></form></body>
anmeldung.xhtml
6. Programm Ablauf
31(c) Alexander Petitjean / Yelena Kolpakova (FH-Wiesbaden) Liste V - Systemprogrammierung - Vortrag CGI Programmierung
#!/usr/bin/env ruby
require 'cgi'require "cgi/session"
cgi = CGI.new("html4") sess = CGI::Session.new( cgi, "session_key" => "rubyweb", "prefix" => "web-session." ) sess["nachname"] = cgi['nachname'] sess["password"] = cgi['password'] sess["compiler_weg"] = cgi['compiler_weg'] if sess["nachname"] =~ /^[A-Z]|[a-z]/ and sess["password"] =~ /secret/ and sess["compiler_weg"]== "formular" sess.close puts cgi.header('location' => '/abgabe_formular.xhtml') elsif sess["nachname"] =~ /^[A-Z]|[a-z]/ and sess["password"] =~ /secret/ and sess["compiler_weg"]== "fileupload" sess.close puts cgi.header('location' => '/abgabe_fileupload.xhtml')
else sess.close puts cgi.header('location' => '/anmeldung_fehler.xhtml') end
anmelden.cgi
6. Programm Ablauf
32(c) Alexander Petitjean / Yelena Kolpakova (FH-Wiesbaden) Liste V - Systemprogrammierung - Vortrag CGI Programmierung
<body> <h1>Abgabe</h1> <form action="/cgi-bin/abgeben_formular.cgi" method="post"> <p>Geben Sie hier den Code ein:<br/> <textarea name="user_eingabe" cols="50" rows="10"></textarea> <input type="submit" value="Senden"/> </p> <p>Wie soll die datei heissen:<br/> <input type="text" name="dateiname" size="40" maxlength="40" /> </p> <p> Welcher File Type: <br/> <input type="radio" name="filetype" value="java" /> JAVA<br/> <input type="radio" name="filetype" value="c" /> C <br/> <input type="radio" name="filetype" value="pas" /> PASCAL <br/> <input type="radio" name="filetype" value="cpp" /> C++ <br/> <input type="radio" name="filetype" value="f90" /> FORTRAN <br/> </p> </form> </body>
abgabe_formular.xhtml
6. Programm Ablauf
33(c) Alexander Petitjean / Yelena Kolpakova (FH-Wiesbaden) Liste V - Systemprogrammierung - Vortrag CGI Programmierung
#!/usr/bin/env rubyrequire 'cgi'require 'cgi/session'require 'stringio'require 'ftools' cgi = CGI.new("html4")begin session = CGI::Session.new(cgi, "session_key" => "rubyweb", "prefix" => "web-session.", "new_session"=>false) rescue ArgumentError print cgi.header('location' => 'nicht_angemeldet.xhtml')end
eingabe = cgi['user_eingabe']datei = cgi['dateiname']typ = cgi['filetype']
abgeben_formular.cgi
6. Programm Ablauf
34(c) Alexander Petitjean / Yelena Kolpakova (FH-Wiesbaden) Liste V - Systemprogrammierung - Vortrag CGI Programmierung
abgeben_formular.cgi
def erzeugen(dateiname, type, code) File.open("/tmp/" + dateiname + "." + type, 'w') do |file| file.puts code endend
if typ == "c" then erzeugen(datei, typ, eingabe) callstring = "gcc -Wall -o /tmp/" + datei + " /tmp/" + datei + ".c" result = system(callstring) if result == true callstring1 = "tar cfz /tmp/program_formular.tar.gz " + "/tmp/" + datei result1 = system(callstring1) if result1 == true puts cgi.header('location' => 'abgabe_ok_formular.xhtml') else puts cgi.header('location' => 'abgabe_archiv_fehler.xhtml') end else puts cgi.header('location' => 'abgabe_compiler_fehler.xhtml') end
elsif typ == "java" then...
6. Programm Ablauf
35(c) Alexander Petitjean / Yelena Kolpakova (FH-Wiesbaden) Liste V - Systemprogrammierung - Vortrag CGI Programmierung
<body> <h1>Abgabe</h1>
<form action="/cgi-bin/abgeben_fileupload.cgi" method="post" enctype="multipart/form-data">
<p>Datei: <input type="file" name="uploadfile" accept="text/*"/> <input type="submit" value="Senden"/> </p> <p> Bitte wählen Sie ihre benutzte Sprache aus: <br/> <input type="radio" name="filetype" value="java" /> Java File <br/> <input type="radio" name="filetype" value="c" /> C File <br/> <input type="radio" name="filetype" value="cpp" /> C++ File <br/> <input type="radio" name="filetype" value="pas" /> Pascal File <br/> <input type="radio" name="filetype" value="f90" /> Fortran File <br/> </p> </form> </body>
abgabe_fileupload.xhtml
6. Programm Ablauf
36(c) Alexander Petitjean / Yelena Kolpakova (FH-Wiesbaden) Liste V - Systemprogrammierung - Vortrag CGI Programmierung
sourcefile = cgi.params['uploadfile'].firstsourcefilename = cgi.params['uploadfile'].first.original_filenamefileext = "." + cgi['filetype'].stringdestfilename = cgi.params['uploadfile'].first.original_filename.delete fileext
File.open("/tmp/" + sourcefilename.untaint, 'w') do |file| file << sourcefile.read end
if cgi['filetype'].string == "java" then callstring = "javac /tmp/" + sourcefilename + " -d /tmp/" result = system(callstring) if result == true callstring = "tar cfz " + "/tmp/program_fileupload.tar.gz " + "/tmp/" + destfilename + ".class" result = system(callstring) if result == true puts cgi.header('location' => 'abgabe_ok_fileupload.xhtml') else puts cgi.header('location' => 'abgabe_archiv_fehler.xhtml') end else puts cgi.header('location' => 'abgabe_compiler_fehler.xhtml') endelsif cgi['filetype'].string == "c" then ...
abgeben_fileupload.cgi
DEMO
37(c) Alexander Petitjean / Yelena Kolpakova (FH-Wiesbaden) Liste V - Systemprogrammierung - Vortrag CGI Programmierung
Fragen ?
38(c) Alexander Petitjean / Yelena Kolpakova (FH-Wiesbaden) Liste V - Systemprogrammierung - Vortrag CGI Programmierung
Vielen Dank
39(c) Alexander Petitjean / Yelena Kolpakova (FH-Wiesbaden) Liste V - Systemprogrammierung - Vortrag CGI Programmierung
Recommended