CGI-Programmierung Wie
Transcription
CGI-Programmierung Wie
Martin Vorländer CGICGI-Programmierung Was ist CGI? q „Common Gateway Interface“ Grundlagen der CGICGI-Programmierung q Protokoll für die Kommunikation zwischen Webserver und externen Programmen q dynamische Erzeugung von Webserver-Ausgaben z.B. HTML, Bilder, PDF, ... Martin Vorländer q Verarbeitung von Formularen PDV-SYSTEME GmbH q Gästebücher, Besucher-Zähler, Chatrooms, ... Bornhardtstraße 3 q entwickelt für den „Ur-Webserver“ NCSA HTTPd 38644 Goslar q bis jetzt existiert kein RFC dafür! CGICGI-Programmierung Wie funktioniert CGI? Wie funktioniert CGI? http://host/htbin/helpgate/help REQUEST_METHOD == “GET“ SCRIPTNAME == “/htbin/helpgate“ PATH_INFO == “/help“ SERVER_NAME == “host“ ... GET /htbin/helpgate/help HTTP/1.0 ... CGICGI-Programmierung q Webserver „weiß“ durch Konfiguration, welches Verzeichnis CGI-Skripte enthält, und wie diese zu behandeln sind q Datenübergabe î „Meta-Variablen“ (i.d.R. Environment-Variablen) HTTP/1.0 200 OK MIME-Version: 1.0 Date: ... Content-Type: text/html Webserver host, Port 80 <HTML> ... WWW_ROOT:[BIN] HELPGATE.COM Status: 200 OK Content-Type: text/html <HTML> ... î Standard Input î Kommandozeile (nur in Spezialfällen) ë Standard Output ⇒ als Programmiersprachen eignen sich z.B. C, C++, Pascal, aber auch Interpreter (z.B. Perl, Python, Tcl) CGICGI-Programmierung URIs (Uniform Resource Identifiers) q auch URLs (Uniform Resource Locators) q Format für absoluten HTTP-URI: http://host[:port]/[path][?query][#fragment] CGICGI-Programmierung URI-Encoding q nicht-reservierte Zeichen: a-z A-Z 0-9 - _ . ! ~ * ' ( ) q reservierte Zeichen: ; / ? : @ & = + $ , q Default für port: 80 q sonstige Zeichen sollten nicht enthalten sein q path: hierarchischer Pfad zur Ressource, Pfadtrenner ist /, muß kein physikalisch vorhandener Pfad sein! q Format für query: q reservierte (und sonstige) Zeichen müssen kodiert werden q q name=wert&name=wert... q keyword+keyword... fragment: Sprungziel innerhalb einer HTML-Resource CGI-Programmierung q Kodierung: % und zwei Hexadezimal-Ziffern z.B. %20 für Leerzeichen 1 Martin Vorländer CGICGI-Programmierung HTTP (HyperText Transmission Protocol) q Anfrage-/Antwort-Protokoll q Anfrage besteht aus q Anfrage-Methode, Anfrage-URI, Protokollversion CGICGI-Programmierung MIME (Multipurpose Internet Mail Extensions) 1 q Problem: RFC 822 definiert Nachrichten-Format nur für 7-Bit-Zeichen und maximal 1000 Zeichen/Zeile q MIME-Kopfzeilen z.B. GET http://host/htbin/helpgate/help HTTP/1.0 q MIME-Version: 1.0 q MIME-Kopfzeilen mit Zusatz-Information q Content-Type: type/subtype [; param=value] q evtl. einem Anfrage-Rumpf z.B. text/plain; charset=ISO-8859-1 oder image/gif q Antwort besteht aus q q Protokollversion, Status-Code q MIME-Kopfzeilen mit Meta- und Zusatz-Information q evtl. einem Antwort-Rumpf Content-Transfer-Encoding Werte: 7bit, 8bit, binary, base64, quoted-printable q Content-ID q Content-Description CGICGI-Programmierung MIME (Multipurpose Internet Mail Extensions) 2 q mehrteilige Rümpfe möglich CGICGI-Programmierung Meta-Variablen 1 q REQUEST_METHOD q Content-Type: multipart/mixed; boundary=XYZ q GET / POST q der Kopf jedes Rumpf-Teils enthält höchstens Content-* Kopfzeilen q HEAD q PUT q DELETE q OPTIONS q TRACE q q q Einleitung für jeden Rumpf-Teil: --XYZ q Abschluß des letzten Rumpf-Teil: --XYZ-- GET für Anfragen ohne Seiteneffekte (Konvention!) Kopf-Daten der entsprechenden GET-Anfrage (ohne Rumpf) CGICGI-Programmierung Meta-Variablen 2 q QUERY_STRING q Daten hinter dem ? des Anfrage-URI q genau so, wie die Anfrage gestellt wurde, d.h. URI-kodiert q PATH_INFO q Daten im Pfad-Teil des Anfrage-URI hinter dem Namen des CGISkripts q PATH_TRANSLATED q Versuchte Übersetzung von PATH_INFO in einen physikalischen Pfad CGICGI-Programmierung Meta-Variablen 3 q CONTENT_TYPE und CONTENT_LENGTH q Informationen über Daten im Rumpf der Anfrage q SCRIPT_NAME q Teil des Anfrage-URI mit URI-Pfad und Name des CGI-Skripts q REMOTE_ADDR und REMOTE_HOST q REMOTE_HOST i.d.R. nicht gesetzt q REMOTE_USER und AUTH_TYPE q nur gesetzt bei authentisierten Anfragen q REMOTE_IDENT CGI-Programmierung 2 Martin Vorländer CGICGI-Programmierung Meta-Variablen 4 Meta-Variablen 5 q SERVER_NAME q CGICGI-Programmierung q HTTP_* Host-Teil des Anfrage-URI q q SERVER_PORT q HTTP_ACCEPT q HTTP_USER_AGENT q HTTP_REFERER q je nach Webserver zusätzliche Variablen q SERVER_PROTOCOL q i.d.R. "HTTP/1.0" oder "HTTP/1.1" q GATEWAY_INTERFACE q q Port-Teil des Anfrage-URI oder der tatsächliche Port q SERVER_SOFTWARE q zusätzliche HTTP-Kopfzeilen vom Klienten, z.B. i.d.R. "CGI/1.1" z.B. bei Apache: q DOCUMENT_URI q DOCUMENT_ROOT q FILEPATH_INFO CGICGI-Programmierung HTML-Eingabemöglichkeiten q ISINDEX q CGICGI-Programmierung HTML-Formulare q INPUT HTML-HEAD-Element q q FORM q TEXT, PASSWORD q CHECKBOX, RADIO q IMAGE q HIDDEN q SUBMIT, RESET q FILE (Erweiterung zum HTML- Standard) URI des aufzurufenden CGI-Skripts METHOD q q q ACTION q q TYPE GET oder POST ENCTYPE • q Default: application/x-www-form-urlencoded q Spezialfall: multipart/form-data nur mit METHOD=POST erlaubt! q TEXTAREA q SELECT / OPTION CGICGI-Programmierung Kodierung der Formulardaten 1 q bei „normaler“ FORM CGICGI-Programmierung Kodierung der Formulardaten 2 q bei FORM mit INPUT TYPE=FILE q Leerzeichen in Feldnamen und -werten werden durch + ersetzt q URI-Encoding der Feldnamen und -werte q Content-Type: multipart/form-data; boundary=... q Feldnamen und -werte werden mit = zusammengesetzt q pro Eingabefeld ein Rumpf-Teil mit q alle solchen Strings werden mit & oder ; zusammengesetzt q dieser String wird q MIME-Nachricht mit • Content-Disposition: form-data; name="name" [; filename="filename"] q bei METHOD=GET mit ? an die ACTION-URI angehängt q bei METHOD=POST als Rumpf verschickt CGI-Programmierung • Content-Type: type/subtype q bei ISINDEX q URI-Encoding der Schlüsselwörter q Schlüsselwörter werden mit + zusammengesetzt q dieser String wird mit ? an die Basis-URI angehängt 3 Martin Vorländer CGICGI-Programmierung Datenübergabe Ausgabe 1 q bei FORM METHOD=GET q CGICGI-Programmierung q nach Standard Output q „Parsed Header“-Skripts über QUERY_STRING q bei FORM METHOD=POST q CGI-Kopfzeilen (werden vom Webserver ausgewertet) q über Standard Input q Status q end-of-file kann fehlen! q Content-Type q Länge in CONTENT_LENGTH q Location • q bei ISINDEX q q über QUERY_STRING q kann auch über die Kommandozeile dann keine HTTP-Kopfzeilen! HTTP-Kopfzeilen q z.B. Expires CGICGI-Programmierung Ausgabe 2 Status-Codes q „Non-Parsed Header“-Skripts (NPH) q q CGICGI-Programmierung müssen komplette HTTP-Nachricht ausgeben q 1. Zeile: HTTP-Statuszeile, z.B. HTTP/1.0 200 OK q HTTP-Kopfzeilen • Date, z.B. Thu, 30 Mar 2000 08:25:00 GMT • Server q 1xx Information q erst genutzt ab HTTP/1.1 q 2xx Erfolg q 3xx Umleitung q 4xx Klienten-Fehler Kennzeichnung für den Webserver ist implementationsabhängig q Apache: Dateiname beginnt mit "nph-“ q Microsoft IIS: Alle Skripte sind NPH-Skripte q 5xx Server-Fehler CGICGI-Programmierung Tipps CGICGI-Programmierung Literatur 1 q Das aktuelle Verzeichnis wird vom Standard nicht festgelegt! q RFCs 822 Text Message Format q Das Akte-X-Motto: Trust Noone! (und schon gar nicht dem Klienten) 1738 URLs 1808 relative URLs 2396 URIs q kein Ausführen von Programmen mit Daten vom Klienten, ohne daß diese geprüft werden! 1945 HTTP/1.0 2616 HTTP/1.1 2045-2048 MIME 1866 HTML 2.0 1867 Form-Based File Upload q Perl: 'eval'-Gefahren, -T q C: popen(), system(), Escapen (mit \) von Sonderzeichen q Interpreter darf nicht vom Webserver aus erreichbar sein! CGI-Programmierung è ftp://ftp.isi.edu/in-notes/rfcXXXX.txt è http://www.rfc-editor.org/rfc.html 4 Martin Vorländer CGICGI-Programmierung Literatur 2 CGICGI-Programmierung Literatur 3 q CGI Standard q CGI Tutorials è http://hoohoo.ncsa.uiuc.edu/cgi/ è http://www.tigerweb.de/internet/cgi/cgi.htm è http://www.w3.org/CGI/ è http://www.stud.ifi.uio.no/~larsga/download/artikler/HTTP_tut.html è http://web.golux.com/coar/cgi/ (RFC-Projekt) è http://www.netzwelt.com/selfhtml/ è auch http://www.teamone.de/selfhtml/ q CGI Programming FAQs è http://www.htmlhelp.org/faq/cgifaq.html è auch http://www.webthing.com/tutorials/cgifaq.html è http://www.boutell.com/openfaq/cgi/ è http://wdvl.com/Authoring/CGI/ è news:comp.infosystems.www.authoring.cgi q CGI und Sicherheit è http://www.w3.org/Security/Faq/wwwsf4.html è http://webreview.com/wr/pub/97/08/08/bookshelf/ CGICGI-Programmierung Literatur 4 qC è http://www.cyberramp.net/~kdthomas/cgiref/ q Perl è http://www.stonehenge.com/merlyn/WebTechniques/ CGICGI-Programmierung Literatur 5 q CGI-Skripte è http://www.cgi-resources.com/ è http://icthus.net/CGI-City/ è http://www.wyenet.com/cgi_scripts/ è http://www.w3.org/Security/Faq/wwwsf5.html è http://worldwidemart.com/scripts/ è http://stein.cshl.org/WWW/software/CGI/ è http://awsd.com/scripts/ è http://home.rheinzeitung.de/~hschomae/perl/file_upload_german.htm è news:de.comp.lang.perl.cgi CGI-Programmierung 5