CGI-Programmierung - cs.hs-rm.de · CGI-Programmierung Fachhochschule Wiesbaden Fachbereich...

Post on 17-Sep-2018

216 views 0 download

Transcript of CGI-Programmierung - cs.hs-rm.de · CGI-Programmierung Fachhochschule Wiesbaden Fachbereich...

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