text: CGI-Anwendung CGI.pm-Modul - PDF
  Download "CGI-Anwendung CGI.pm-Modul"
  1 CGI-Anwendung CGI.pm-Modul
  2 Übersicht Was ist CGI? Was braucht man, um eine CGI in Gang zu bringen? Wie funktioniert CGI? Datenübertragung mit HTTP- Methode GET Datenübertragung mit HTTP- Methode POST MIME-Typen(Content-Types) Mod_Perl
  3 Was ist CGI? CGI = Common Gateway Interface ein Satz von Regeln(ein Protokoll ) für Kommunikation zwischen einem Webserver und externen Programmen( Gateways ) ->Externe Programme werden auf Websites z.b. genutzt, um Webserver-Ausgaben dynamisch zu erzeugen, z.b. HTML, Bilder, PDF, etc. Formulare zu verarbeiten Suchmaschinen, Shopping Carts, Gästebücher, Besucher-Zähler, Chatrooms, etc. zu implementieren
  4 Was braucht man, um eine CGI in Gang zu bringen? HTTP bzw. Web Server Apache Xitami Roxen Client(Browser) Perl Programm
  5 Wie funktioniert CGI? Ausgabe der Daten in HTML <html> <body> Daten, Fakten </body> </html> Client CGI-Programm Web-Server Mit Common Gateway Interface Datenbanken, Dateien,etc.
  6 Wie funktioniert CGI? Ein Beispiel: #!c:/perl/bin/perl.exe print "Content-type: text/html\n\n"; print "<h1>anzahl der Umgebungsvariablen insgesamt: ".scalar keys(%env)."</h1>"; foreach(sort (keys (%ENV))) { print "<p><b>$_:</b> $ENV{$_} </p>\n\n"; }
  7 Wie funktioniert CGI? Ein Beispiel:
  8 Datenübertragung mit HTTP- Methode GET(hole): Um Methode GET in einem HTML-Formular zu verwenden, ist im <form> -Tag die Angabe method=get erforderlich, z. B.: <form action=test..pl method=get> Bei der Übertragung der Daten an das CGI- Skript werden die zu übertragenden Parameter an den URL der Client- Anfrage gehängt Die Parameter müssen hinter die URL des Skriptes mit einem Fragezeichen getrennt angehängt werden
  9 Datenübertragung mit HTTP- Methode GET(hole): Die Umgebungsvariable QUERY_STRING wird mit dem Wert der so übergebenen Parameter belegt QUERY_STRING beinhaltet alles, was dem ersten? des URL folgt, der auf das CGI-Skript verweist Alle zu übergebenden Werte werden in der Form Name=Wert eingebunden, wobei Name der im HTML-<input>- Tag angegebene Name ist, und Wert der entsprechende Eintrag im Eingabefeld Ein QUERY_STRING, der einem CGI-Programm übergeben wird, kann z.b. so aussehen: $str= Hallo+diese+Zeichenfolge+muss+wieder+dekod iert+werden&zeichen1=%25&wert=1
  10 Datenübertragung mit HTTP- Methode POST(sende/schicke): Methode zur Übertragung großer Datenmengen an den Server Die Daten werden dem Webserver im Entity- Body übergeben und an das CGI- Skript über die Standardeingabe weitergeleitet Diese Methode unterscheidet sich von der GET- Methode in der Form der Übermittlung der Parameterstatt einer Variablen werden die Daten über die Standardeingabe(<STDIN>) übertragen
  11 Datenübertragung mit HTTP- Methode POST(sende/schicke): Die Variable CONTENT_LENGTH enthält die Länge der Eingabedaten in Bytes Um an die übertragenden Daten heran zu kommen, muss das CGI-Skript die Standardeingabe auslesen: read(stdin, $Form_Dat, $ENV{`CONTENT_LENGTH`}); Die Daten werden für den Benutzer unsichtbar an den Server übertragendatenschutz
  12 GET versus POST (oder beides zusammen) Form der Übertragung GET-Methode: die Parameterdaten werden als Anhang an die URL übertragenbegrenzte Datenlänge Als Lösung des Problems wurde die POST-Methode eingeführtdie Daten der Parameter werden im Body weitergegeben(daten in temporärer DateiSkript) Die Limitierung ist nicht mehr von der Software und deren RAM- Platz sondern nur noch vom Plattenplatz abhängig Übermittlung größerer DatenmengenPOST-Methode
  13 MIME-Typen(Content-Types) MIME= Multipurpose Internet Mail Extensions ursprünglich für s gedacht bezeichnen die Art der im Internet übertragenden Dateien Wenn ein CGI-Skript einen HTTP-Header an den aufrufenden Browser sendet, muss es den MIME- Typ der nachfolgenden Daten senden, z.b.: content-type : text/html
  14 MIME-Typen(Content-Types) <gruppe>/<typ> : text/html Text/html = für Textdateien image/gif/jpeg = für Grafikdateien video = für Videodateien audio = für Sound-Dateien application/octet-stream = für Dateien, die an ein bestimmtes Programm gebunden sind multipart = für mehrteilige Daten message = für Nachrichten model = für Dateien, die mehrdimensionale Strukturen repräsentieren
  15 Mod_Perl Ist ein Modul für den Apache Webserver Integriert einen Perl- Interpreter in den HTTP-Server Der Pfad zum Perl- Interpreter ist nicht mehr erforderlich Zwei wichtigsten Module des mod_perl Pakets: Apache::PerlRun Apache::Registry
  16 Mod_Perl Apache::PerlRun schnellere Ausführungder Skripte Skript wird bei jedem HTTP-Request neu kompiliert, ohne einen neuen Perl-Prozess zu öffnen nur für Skripte mit use strict nur für Skripte ohne globalen Variablen
  17 Mod_Perl Apache::Registry Geschwindigkeitsvorteil Verwendung von use strict Verwendung von globalen Variablen
  18 Mod_Perl So sieht z.b. ein Perl- Programm unter mod_perl aus: # firstscript.pl unter mod_perl print Content-type: text/html\n\n ; use strict; my $in; print Hallo, ich bin $0<br> und werde vom Perl Interpreter: $^x Version: $]<br> Auf dem Betriebssystem: $^0 ausgeführt<br> und wer bist du? ; print <br>hallo, viel Spass mit Mod_Perl\n ;
  19 Mod_Perl Ausgabe des Skriptes nach der Angabe der Adresse z.b.: Hallo, ich bin /usr/local/apache/htdocs/modperl/firstscript.pl und werde vom Perl-Interpreter: httpsd Version: auf dem Betriebssystem: linux ausgeführt und wer bist du? Hallo, viel Spass mit Mod-Perl
  20 Übersicht Das CGI.pm Modul Objektorientierter Programmierstil Funktionsgruppen Funktionsorientierter Programmierstil Subroutinen Erzeugung von Formularen Der Taint-Modus Mögliches Problem
  21 Das CGI.pm Modul seit der Version Autor des Moduls: Lincoln Stein aktuelle Version: ftp://ftp-genome.wi.mit.edu/pub/software/www ist Perl-Bibliothek vereinfacht Generierung von Web-Formularen und Parsing definiert CGI-Objekte und Zustandsvariablen stellt Funktionen der CGI-Programmierung bereit, z.b.: Upload von Dateien, Cookies und Frames
  22 Objektorientierter Programmierstil $q = new CGI; Neues CGI-Objekt wird erzeugt. $q -> header; HTTP-Header wird generiert. print $q -> start_html( xyz ); HTML wird eingeleitet. print $q ->h1( xyz ) ; Level-1-Header wird erzeugt. print $q ->end_html ; HTML wird abgeschlossen.
  23 Objektorientierter Programmierstil Beispiel: #!C:/Perl/bin/perl.exe use CGI; $q = new CGI; print $q->header; print $q->start_html(1. Beispiel'); print $q->h1( Beispiel'); print $q->h2( Das Beispiel wurde OOP programmiert ); print $q->end_html;
  24 Funktionsgruppen CGI.pm-Routinen müssen ins Skript importiert werden: use CGI 'Liste der Methoden ; use CGI 'header', 'start_html', 'h1', 'h2', 'end_html'; Satz von Funktionen werden mit :Funktionsgruppe importiert Liste der importierbaren Funktionsgruppen: :html3 Import aller Methoden, mit denen bei HTML 3.0 vorgeschlagene Elemente (z.b. <table>) generiert werden können :html2 Import aller Methoden, mit denen HTML-2.0-Standardelemente generiert werden können :netscape Import aller Methoden, die Netscape-spezifische HTML-Erweiterungen generieren :html Import aller HTML-generierenden Kurzformen ('html2' + 'html3' + 'netscape')
  25 Funktionsgruppen Liste der importierbaren Funktionsgruppen: :cgi Import aller Methoden zum CGI-Handling, z.b. param() :form Import aller Methoden zur Formulargenerierung, z.b. textfield() :standard Import der "Standard"-Features ('html2', 'html3', 'form, 'cgi ) :all Import aller verfügbaren Methoden
  26 Funktionsorientierter Stil Beispiel: #!C:/Perl/bin/perl.exe use CGI qw/:standard/; print header; print start_html( Beispiel'); print h1( Beispiel'); print h2( Das Beispiel wurde funktionsorientiert progammiert ); print end_html;
  27 Die Subroutine param () Subroutine param() häufigste verwendete Subroutine zur names = $q ->param; # Bestimmung der Namen aller an das Skript # übergebenen = $q->param( names ); # Bestimmung der oder des Werte(s) eines einzelnen # benannten Parameters $q->param( 1, 2 ) # Setzen der oder des Werte(s) # benannten Parameters
  28 Weitere Subroutinen Subroutine accept() query_string() raw_cookie() referer() remote_addr() remote_host() request_method() Was erhält man dadurch? Liste der MIME-Typen, die der Browser akzeptiert Argumente fürs CGI-Skript, die an den URL angehängt wurden liefert reine Cookie-Informatios URL der Seite, die dieses Skript aufgerufen hat IP-Adresse des Hosts, der dieses Skript aufgerufen hat Name des Hosts, der dieses Skript aufgerufen hat Webserver-Methode, mit der Skript aufgerufen wurde (GET oder POST)
  29 Weitere Subroutinen script_name() server_name() server_software() virtual_host() server_port() user_agent() user_name() Name des Skripts Hostname des Webservers, der dieses Skript aufgerufen hat Name und Version der Webserver-Software Für Server, die virtuelle Hosts unterstützen, der Name des virtuellen Hosts, der dieses Skript ausführt Netzwerk-Port, den der Server verwendet Name und Version des Browsers, der dieses Skript aufgerufen hat Name des Benutzers, der dieses Skript aufgerufen hat
  30 Erzeugung von Formularen Anfang und Ende eines Formulars Erzeugung eines Textfeldes Erzeugung eines Popup-Menüs Erzeugung einer Gruppe zusammengehöriger Kontrollkästchen print $query- >startform($method,$action,$encoding); print $query->endform; print $query->textfield(-name=>'feldname', -default=>'startwert', -size=>50, -maxlength=>80); print $query->popup_menu(-name=>'popup', -values=>['1','2','3','4']); print $query->checkbox_group( -name=>'group_name', -values=>['1','2','3,'4'], -default=>['1','2']);
  31 Erzeugung von Formularen Erzeugung einer Gruppe von Radio-Buttons Erzeugung eines Submit Buttons Erzeugung eines Reset Buttons print $query->radio_group( -name=>'group_name', -values=>['1','2','3'], -default=>'1'); print $query->submit( -name=>'button_name'); print $query->reset;
  32 Der Taint-Modus erlaubt bei Ausführung eines Perl-Skripts die Verfolgung und Überwachung von Benutzereingaben sowie weiteren sicherheitsrelevanten Einflussmöglichkeiten des Benutzers Taint-Modus wird so eingeschaltet: #!/C:/Perl/bin/perl.exe T
  33 Taint-Modus - Funktionsweise alle Benutzereingaben und durch Benutzer beeinflussbare Variablen werden automatisch als tainted (= vergiftet ) gekennzeichnet in Verbindung mit tainted -Variablen sind folgende Operationen nicht erlaubt: Kommandos, die direkt und indirekt eine Shell aufrufen Operationen, die Dateien oder Verzeichnisse modifizieren Operationen, die Prozesse beeinflussen Aufheben des Tainted -Zustands mit: $Variablenname = $1;
  34 Mögliches Problem durch Denial of Service - Angriffe Denial of Service -Angriffe werden durch richtige Konfiguation vermieden : Web-Server CGI.pm use CGI qw/:standard/; use CGI::Carp 'fataler Browser-Fehler'; $CGI::POST_MAX=1024 * 100; # max. 100K POSTings $CGI::DISABLE_UPLOADS = 1; # keine Uploads
  35 Quellen Perls fürs Web, M. Kästner, Galileo Press, Bonn 2003 Perl, T. Roßner, bhv Verlag, Kaarst 1998 Webprogrammierung mit Perl und CGI, U. Schrader, Franzis Verlag, Poing 2004 Programmieren mit Perl, L. Wall, O Reilly, Köln 2001 Perl-Anwendungen im Web, E. Petter, VDE Verlag, Berlin 2002 CGI & Perl für Einsteiger, IPV Inland Presse, Hamburg 2001 CGI-Programmierung mit Perl, S. Guelich, S. Gundavaram, G. Birznieks, O Reilly Köln 2001 CGI-Anwendung mit Perl, K. Meltzer, B. Michalski, Addison Wesley Verlag, München 2001 Perl/CGI, G.A. Leierer, R.D. Stoll, DATA Becker, Paderborn
  Material zum Praktikumsversuch Stand: Juli 2011, zusammengestellt von: Michael Psarros (Lehrstuhl NDS) Version 2.4 Grundpraktikum zur IT-Sicherheit Sicheres CGI-Scripting Lehrstuhl für Netz- und Datensicherheit
  Grundpraktikum Netz- und Datensicherheit. Thema: Sicheres CGI-Scripting
  Grundpraktikum Netz- und Datensicherheit Thema: Sicheres CGI-Scripting Lehrstuhl für Netz- und Datensicherheit Ruhr-Universität Bochum Versuchdurchführung: Raum ID 2/168 Betreuung: Florian Feldmann Zusammengestellt