Dynamisch erzeugte Webseiten mit Formularen oder angebundenen Datenbanken erfordern in der Regel die serverseitige Ausführung von Programmen, die die Formularverarbeitung oder die Daten einer externen Datenbank zur Laufzeit in die Webseite integrieren. Die für solche Zwecke geschaffene Schnittstelle zwischen dem Webserver und den dort abgespeicherten Programmen trägt den Namen Common Gateway Interface (CGI).
Das Common Gateway Interface ist eine Schnittstelle, mit dem es möglich wird, externe Programme unter Steuerung eines Webservers ablaufen zu lassen.
Mit CGI kann ein HTTP- Server Informationen, die sich z.B. in einer SQL- Datenbank befinden und auf die der Webclient zunächst keinen Zugriff hat, verarbeiten und dem Client anschliessend zur Verfügung stellen. Das CGI- Programm übernimmt also die Funktion eines Gateways zwischen dem HTTP- Server und dem HTTP- Client.
Das Common Gateway Interface regelt dabei den Aufruf und die Parameterversorgung der externen Programme, die auch als CGI- Scripte oder kurz als CGIs bezeichnet werden. Diese können in einer beliebigen, auf dem jeweiligen System ausführbaren Programmiersprache erstellt werden, z.Bsp. C/C++, Perl, TCL oder eine beliebige Unix- Shell. Die aktuelle Version ist CGI/1.1.
Die Parameterübergabe erfolgt dabei in Abhängigkeit von der beim Aufruf des CGI- Programms gewählten HTTP- Methode GET oder POST. Der HTTP- Server und das aufgerufene Programm kommunizieren über eine Reihe von im CGI- Standard festgelegten Umgebungsvariablen. Diese enthalten Informationen über den HTTP- Server und die vom Client erzeugte Anfrage.
Der hinter der CGI- Schnittstelle stehende Mechanismus ist nicht besonders schwierig: Ein HTTP- Client fordert eine Seite an, deren URL auf ein vom Server auszuführendes Programm verweist. Dieses befindet sich entweder in einem speziellen, dem Server aufgrund seiner Konfiguration bekannten Verzeichnis (z.B. "cgi-bin"), oder dessen Dateiendung wurde einem internen Webserver- Handler zugeordnet.
Der Server erkennt an der Dateiendung, dass es sich um ein Programm oder Script handelt, und führt es aus. Das Script erzeugt einen Antwort- Header gemäss dem HTTP- Protokoll, eine Leerzeile sowie den Inhalt der Antwort. Die Ausgabe des Programms erfolgt auf die Standardausgabe, die vom HTTP- Server auf den HTTP- Client, d.h. auf den Browser, umgeleitet wird.
Ein CGI- Script kann entweder über die HTTP- Methode GET oder POST aufgerufen werden.
Datenübertragung mit der HTTP- Methode GET
Wenn ein HTML- Formular die Methode GET verwendet, wird der Formulardatenstrom, durch ein Fragezeichen von dem URL des verarbeitenden CGI- Scripts getrennt, als Query- String angefügt. Im Client- Browser sind die Daten des Formulardatenstroms nach dem Absenden des Formulars in der URL- Zeile sichtbar.
Um die Methode GET in einem HTML- Formular zu verwenden, ist im einleitenden <form> Tag die Angabe method="get" erforderlich, z.Bsp.: <form action="test..pl method="get"> Bei der Übertragung der im Formular zur Verfügung gestellten Daten an das CGI- Script werden bei der Methode GET die zu übergebenden Parameter - durch ein Fragezeichen getrennt - an den URL der Client- Anfrage gehängt. Hierdurch wird die Umgebungsvariable QUERY_STRING mit dem Wert der so übergebenen Parameter belegt. Die Umgebungsvariable QUERY_STRING beinhaltet alles, was dem ersten ? des URL folgt, der auf das Script verweist.
Neben der Verwendung der Methode GET kann diese Information auch von einem ISINDEX- Dokument oder in einem <a> Link, der auf das Script zeigt, z.Bsp. <a href="test.pl?Kennung=$kennung">Auswahl</a> erzeugt werden.
QUERY_STRING ist standardmässig entsprechend dem URL- Encoding- Verfahren kodiert. Dies bedeutet, dass in HTML- Eingabefeldern eingegebene Leerzeichen in + und Sonderzeichen im QUERY_STRING durch den hexadezimalen ASCII- Code mit einem führenden %- Zeichen ausgedrückt werden. So wird $ zu %24, ( zu %28 und ) zu %29.
Alle zu übergebenden Werte werden in der Form "Name=WERT" eingebunden, wobei "Name" der im <input> Feld angegebene Name ist, und "Wert" der entsprechende Eintrag im Eingabefeld. Ein QUERY_STRING, der einem CGI- Programm übergeben wird, kann also bspw. so aussehen:
$str="Hallo+diese+Zeichenfolge+muss+wieder+dekodiert+werden&zeichen1=%25&wert=1"
Bevor der Inhalt von QUERY_STRING weiterverwendet werden kann, ist deshalb eine entsprechende Dekodierung erforderlich. Näheres dazu erfahren Sie hier.
Datenübertragung mit der HTTP- Methode POST
Die zweite Möglichkeit, Daten an ein CGI- Script zu übergeben, erfolgt unter Verwendung der HTTP- Methode POST. Hierbei werden dem Webserver die Daten im Entity- Body übergeben und an das CGI- Script über die Standardeingabe weitergeleitet. Der HTTP- Server sendet in diesem Fall kein EOF, das Ende der übertragenen Daten müssen Sie vielmehr anhand der Umgebungsvariablen CONTENT_LENGTH selbst ermitteln.
Um an die übertragenen Daten heranzukommen, muss das jeweilige verarbeitende CGI- Script die Standardeingabe auslesen. In Perl kann das bspw. mit der folgenden Anweisung bewerkstelligt werden: read(STDIN, $Form_Dat, $ENV{'CONTENT_LENGTH'});
Bei der POST- Methode bleibt der in <form action"URL" method="post"> angegebene URL also unverändert, die Daten werden für den Benutzer unsichtbar an den Server übertragen, was insbesondere auch aus Datenschutzgründen von Vorteil ist.
Datenübertragung unter Verwendung der Umgebungsvariablen PATH_INFO
CGI ermöglicht darüber hinaus den Einschluss von Informationen in den URL des aufgerufenen Scripts, um zusätzliche kontextspezifische Informationen an das Script zu übergeben. Diese Informationen, die über die Umgebungsvariable PATH_INFO übertragen werden, sind als Zusatzinformationen nach dem Pfad des CGI-Scripts im URL anzugeben und werden vom Server nicht kodiert.
Die Umgebungsvariable PATH_INFO ist in erster Linie dazu gedacht, im URL einen Dateinamen als Parameter zu übergeben. PATH_INFO lässt allerdings offen, an welcher Stelle im Filesystem die Datei zu finden ist. Diese Information ist der Umgebungsvariablen PATH_TRANSLATED zu entnehmen, die die relative Pfadinformation der Umgebungsvariablen PATH_INFO auf die Verzeichnisstruktur des Serverrechners bezieht.
Header und MIME- Typen
Ein CGI- Script kann Dokumente beliebigen Formats generieren, z.Bsp. HTML- Dokumente. Damit der Client, dem das generierte Dokument zugesandt wird, weiss, um welche Art Dokument es sich handelt, erzeugt das CGI- Script vor den eigentlichen Nutzdaten einen Header. Der Header besteht aus Textzeilen mit dem Format der schon beschriebenen HTTP- Header und wird durch eine Leerzeile abgeschlossen.
Jeder Header besteht aus mindestens zwei Zeilen, die für jedes Script zwingend erforderlich sind. Die erste Zeile spezifiziert dabei den MIME- Type des Dokuments, z.Bsp.:
Content- Type: text/html
MIME ist die Abkürzung von Multiporpose Internet Mail Extensions. MIME- Typen bezeichnen die Art der im Internet übertragenen Dateien. Durch die Angabe des MIME- Types erkennt der das Dokument empfangende Webclient, wie er das gesendete Dokument weiterverarbeiten kann.
Die zweite Zeile ist eine Leerzeile, die den Header von den eigentlichen Nutzdaten abtrennt.
Dekodierung von GET- und POST- Daten
Zur Behandlung von Daten, die über die CGI- Schnittstelle übertragen wurden, insbesondere auch für das Parsen von GET- und POST- Daten, stellt (für Perl) das CPAN- Modul CGI.pm entsprechende Methoden und Subroutinen zur Verfügung.
Als Beispiel wird nachfolgend gezeigt, wie die Dekodierung ohne Unterstützung des CGI- Moduls durchgeführt werden kann.
In diesem Beispiel werden einige Register der Perlprogrammierung gezogen, auf die im Detail hier nicht eingegangen wird.
Der nachfolgende Algorithmus zur Dekodierung von Daten, besteht aus folgenden Schritten: