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