Common Gateway Interface - CGI

Hilfsprogramme für den Webserver

Der CGI-Standard regelt die Zusammenarbeit zwischen HTTP-Webserver und Hilfsprogrammen.
Als Helfer dienen ausführbare Programme und Script-Programme.
Ein CGI-Programm stellt als Ausgabe-Produkt meistens HTML-Quelltext her, welchen der Webserver als 'Dynamische Webseite' an den Browser sendet.
Dynamische Webseiten Vergleich: Statische und dynamische Webseiten
Webserver Voraussetzung für CGI-Programme
Programme Direkt ausführbare CGI-Programme (Binaries)
Scripts Indirekt ausführbare Script-Programme
Java Servlets und Applets
Javascript Hilfsprogramme für den Client-Browser
Server & Client Vergleich von Server und Client-Hilfsprogrammen
Weitere CGI-Themen auf anderen Seiten
Minimal-Anforderung an ein CGI
Parameter-Übergabe mit GET
Parameter-Übergabe mit POST
Execute-Recht für alle !
Links CGI-Links Ausgewählte Links zum Thema "CGI"

Statische und dynamische Webseiten

Statische Webseite Dynamische Webseite

Aufruf einer statischen Webseite

Browser fordert eine Webseite an, z.B. demo.html
Webserver erhält die Anforderung
Webserver sendet den Inhalt der verlangten Text-Datei an den Browser.
Browser empfängt die Daten (=HTML Quelltext).
Browser erstellt aus den Daten eine Webseite.

Aufruf einer dynamischen Webseite (CGI-Programm)

Browser fordert eine Webseite an, z.B. demo.bin (Linux) oder demo.exe (Windows)
Webserver erhält die Anforderung
Server erkennt, dass ein ausführbares Programm angefordert wird und startet es.
Das Programm erzeugt einen Text (HTML Quelltext) und übergibt ihn an den Webserver.
Webserver sendet den erhaltenen Text an den Browser.
Browser empfängt die Daten (=HTML Quelltext).
Browser erstellt aus den Daten eine Webseite.
Aus Sicht des Browsers ergibt sich kein Unterschied zwischen einer statischen und einer dynamischen Webseite !
Der Unterschied betrifft nur den → Webserver !

HTML-Quelltext

Die Text-Datei demo.html enthält → HTML Quelltext, d.h. lesbaren Text. Sie ist in einem Verzeichnis des Webserver-PC gespeichert.
Bei Anforderung der Datei erhält ihr Browser genau den darin enthaltenen Text, z.B.
<html>
<h2>Datei demo.html</h2>
</html>

Link zur Anforderung der statischen Webseite:
<a href="demo.html"> Statisch </a>

Binär-Datei

Die Datei demo.bin ist ein ausführbares Programm in Maschinensprache (Binär, daher nicht als Text lesbar). Sie ist in einem Verzeichnis des Webserver-PC gespeichert.
Bei Anforderung dieser Datei erhält ihr Browser nicht die Datei, sondern jenen Text, der von diesem Programm Live erzeugt wurde.

Link zur Anforderung der dynamischen Webseite:
<a href="/cgi-bin/demo.bin"> Dynamisch </a>
Einbettung der statischen Mini-Webseite demo.html
Einbettung der dynamischen Mini-Webseite demo.bin
Mit Rechtsklick in eine der eingebetteten Webseiten wird der Quelltext angezeigt:
Bei statischen Webseiten ist der angezeigte Text identisch mit dem Inhalt der Original-Datei. Bei dynamischen Webseiten sehen sie nicht das Programm sondern den vom Programm Live erzeugten Text.
Test: Programm erneut ausführen.

Vorteil

Statische Webseiten erfordern weniger Aufwand vom Webserver.

Nachteil

Keine Änderung möglich: Jede/r Web-BesucherIn erhält zu jedem Zeitpunkt genau die gleiche Webseite.

Vorteil

Je nach Programm kann eine dynamische Webseite bei jeder Anforderung anders aussehen und/oder andere Inhalte bieten.
Das ist z.B. für den Zugriff auf Datenbanken, Suchmaschinen usw. unbedingt erforderlich.

Nachteil

Dynamische Webseiten werden bei jeder einzelnen Anforderung Live hergestellt, erfordern daher mehr Server-Aufwand.

Webserver

CGI-Programme kann man nur zusammen mit einem → Webserver verwenden.
Ein Webserver ist ein (Hintergrund)-Programm, welches als Dienstleitung Web-Inhalt verteilt, z.B. (HTML)-Webseiten, Grafik, usw.
Jeder Webserver kann mit beliebig vielen Clients (=Browser-Programmen) zusammenarbeiten. Voraussetzung ist eine funktionierende Netzwerk-Verbindung zwischen Client und Server.

Details zum Thema (Apache) Webserver
In jeder gängigen Linux-Distribution ist der → Apache Webserver für Linux enthalten oder mit Mausklick installierbar. Für Windows-PC kann man den → Apache Webserver für Windows kostenfrei aus dem Internet laden, muss ihn jedoch selbst installieren und konfigurieren.
Jedes halbwegs professionelle lokale Netzwerk (LAN) enthält einen Server-PC, auf dem alle gemeinsam nutzbaren Dienste installiert sind - fast immer auch ein Webserver. Ein Webserver-Programm lässt sich jedoch auch an jedem Arbeits-PC installieren. Das ist bei der Leistung moderner PC kein Problem, bietet jedoch viele praktische Möglichkeiten, z.B. die Nutzung moderner Web-Programm-Pakete (GroupWare, Content Management, Wiki, ...).
Ein Webserver verwaltet CGI-Programme in einem eigens dazu konfigurierten Verzeichnis, meist mit dem Namen cgi-bin Im CGI-Verzeichnis eines Webservers befinden sich sowohl direkt ausführbare Programm-Dateien (Linux-Binaries bzw. Windows *.exe) als auch Script-Programme (z.B. *.pl in der Programmiersprache → Perl).

Direkt ausführbare Programme (Binaries)

Binaries sind binäre Dateien, die ein ausführbares Programm enthalten, z.B. auf Windows *.exe Dateien. Alle anderen Betriebssysteme brauchen keine besondere Datei-Endung, in den Beispielen dieser Seite werden ausführbare Linux-Programme jedoch zur besseren Orientierung mit *.bin bezeichnet.

Direkt ausführbare Programme sind nicht portabel, d.h. man kann sie nur auf PC's jenes Betriebssystems verwenden, für welches sie hergestellt (compiliert) wurden. Man braucht daher eigene Versionen eines CGI-Programms für einen Linux Server-PC und für einen Windows Server-PC.
Zur Herstellung von direkt ausführbaren Programmen verwendet man meistens die Programmiersprache → C/C++
C/C++ Programme sind in der Herstellung relativ teuer, laufen jedoch mit maximaler Geschwindigkeit.

Eine binäre Programm-Datei kann alle Bytes mit Werten 0...255 enthalten. Im Gegensatz dazu enthalten einfache Text-Dateien nur Bytes 32...126 (Zeichensatz). Man kann die in binären Dateien enthaltenen Programme daher nicht mit einem Text-Editor Programm lesen.
Beispiel: Das Programm demo.bin, mit dem im ↑ ersten Kapitel dieser Seite eine dynamische Webseite Live hergestellt wird.

Indirekt ausführbare Script-Programme

Script-Programme sind Dateien, die Anweisungen für eine (Interpreter)-Programmiersprache als lesbaren Text enthalten.
Zur Ausführung wird der Programm-Text von einem sog. Interpreter-Programm gelesen, in Maschinensprache übersetzt und sofort ausgeführt.

Script-Programme brauchen zur Ausführung das Interpreter-Programm der jeweiligen Programmiersprache, welches am Webserver-PC installiert sein muss.

Beispiel: Das Script-Programm demo.pl in der Programmiersprache → Perl enthält diese Perl-Anweisungen in Klartext:
#!/usr/bin/perl
use POSIX;
print "Content-type: text/html\n\n";
print "<html>\n";
print "<h2>Programm demo.pl</h2>\n";
$iso = strftime('%Y-%m-%d %H:%M:%S',localtime(time()));
print "Live-Ausf&uuml;hrung: $iso\n";
print "</html>\n";
In der ersten Text-Zeile befindet sich nach der Marke #! der Pfad zu jenem Interpreter-Programm, mit dem der Text des Scripts übersetzt und ausgeführt werden soll. Auf einem Windows Server-PC lautet die erste Zeile z.B.
#!C:\Programme\Perl\perl.exe
Das Interpreter-Programm (perl.exe) ist selbst ein direkt ausführbares Programm für das jeweilige Betriebssystem.

Das oben angezeigte Script-Programm ist hier ausnahmsweise sichtbar. Normalerweise ist diese Datei nur am Server-PC zugänglich und kann von BesucherInnen weder gelesen noch verändert werden.
Einbettung der dynamischen Mini-Webseite demo.pl


Bei dynamischen Webseiten wie dieser sehen sie nicht das Programm sondern den vom Programm Live erzeugten Text.
Test: Programm erneut ausführen.

Die meisten Script-Programme verwenden eine der Programmiersprachen Perl, PHP oder Python, die man kostenfrei in jedem gängigen Betriebssystem installieren kann.

Vorteile: Script-Programme sind (mit Ausnahme der 1.Zeile) portabel, d.h. man kann sie unverändert auf jedem Betriebssystem einsetzen. Sie lassen sich besonders rasch und preiswert entwickeln, und man kann sehr viele Beispiele aus dem Internet laden.

Nachteile: Script-Programme werden bei jeder einzelnen Anforderung erneut übersetzt und ausgeführt. Das erfordert deutlich mehr Server-Zeit als ↑ direkt ausführbare Programme

Perl

In dieser modernen Programmiersprache sind viele fertig erhältliche CGI-Programme erstellt.

Natürlich kann man Perl Script-Programme auch selbst herstellen.
Auf jedem gängigen Linux-System ist Perl bereits installiert.
Für Windows-PC kann man Perl kostenfrei aus dem Internet laden und installieren (→ Perl auf Windows).
Perl ist eine modulare Programmiersprache: Es gibt hunderte von Perl-Modulen für alle denkbaren Anwendungen.
Perl Script-Programme sind System-unabhängig, d.h. sie laufen unverändert auf Linux, Windows, oder MacOS. Daher gibt es keine speziellen Versionen für bestimmte Systeme. Ausgenommen sind Perl-Programme zur Systemverwaltung: Sie werden speziell für ein bestimmtes System hergestellt.

Details zur Entwicklung von Perl-(CGI)-Programmen

PHP

Diese moderne Programmiersprache wird ebenfalls für viele fertig erhältliche CGI-Programme oder für eigene Entwicklungen eingesetzt.

Auf jedem gängigen Linux Server-System ist PHP bereits installiert. Auf Desktop-Systemen kann man PHP mit Mausklick installieren.
Für Windows-PC kann man PHP kostenfrei aus dem Internet laden und installieren (→ PHP auf Windows).

PHP ist eine modulare Programmiersprache: Es gibt zahlreiche PHP-Module für alle denkbaren Anwendungen.
PHP Script-Programme sind System-unabhängig, d.h. sie laufen unverändert auf allen gängigen Betriebssystemen. Davon ausgenommen sind nur wenige Programme, die mit Besonderheiten eines Systems (z.B. Windows Registry-Datenbank) arbeiten.
PHP ist besonders einfach zu lernen und anzuwenden. Die meisten dynamischen Webseiten dieses Webs verwenden PHP.

Details zur Entwicklung von PHP-Programmen

Alternative: Java

Die moderne Programmiersprache → Java verwendet eine Kombination von Compiler- und Interpreter-Methoden.

Der Java-Quelltext wird von einem Compiler-Programm einmalig übersetzt. Das Ergebnis ist jedoch nicht ein ↑ direkt ausführbares Programm (wie mit der Programmiersprache C/C++) sondern eine binäre Datei *.class in Java-ByteCode. Diese Datei wird von einem virtuellen Betriebssystem (JVM) ausgeführt, welches zwischen ByteCode-Programm und dem 'echten' Betriebssystem vermittelt.

Vorteile: Der Quelltext wird nur einmal compiliert, das spart Zeit und macht Java-Programme sehr schnell. Die ByteCode-Datei ist portabel, d.h. man braucht nur eine Version für alle Betriebssysteme.

Nachteile: Der Java Runtime Engine (JRE) muss installiert werden, denn damit wird das JVM-System betrieben. Den JRE erhält man kostenfrei für alle gängigen Betriebssysteme.
Zum erstmaligen Laden braucht das JVM-System relativ lange - das fällt allerdings bei einem Server-PC nicht ins Gewicht, weil der Server meist mehrere Wochen oder Monate ohne Unterbrechung läuft.

Java Applets

Dieser Typ von Java-Programmen lässt sich in Webseiten einbetten und läuft am Client-PC (d.h. an ihrem PC).

Java (der Runtime Engine JRE) ist in allen gängigen Linux-Distributionen enthalten oder lässt sich mit Mausklick installieren.
Für Windows-PC muss man den JRE laden und selbst installieren. Das ist kostenfrei und problemlos, und in jedem Fall sehr empfehlenswert.

Man kann Java Programme (insbesondere auch Java-Applets) kostenfrei selbst entwickeln. Diese Programme verwenden normalerweise ein komfortables grafisches User-Interface (GUI) und erfodern daher zur Entwicklung fortgeschrittene Kenntnisse.

Details zur Entwicklung von Java-Programmen

Java Servlets

Dieser Typ von Java-Programmen arbeitet als Hilfsprogramme für Webserver.

Tomcat ist ein kostenfreier Webserver, der auf die Zusammenarbeit mit Java Servlets spezialisiert ist.
Man kann Tomcat gleichzeitig mit einem Apache Webserver betreiben.

Man kann Java Servlets für die gleichen Zwecke verwenden wie andere CGI-Programme. Typisch ist die Erzeugung dynamischer Webseiten sowie von dynamischer Grafik.

Java Servlets arbeiten sehr effizient, erfordern jedoch zur Programmierung und Implementierung fortgeschrittene Kenntnisse.

Alternative: Javascript

Mit der Programmiersprache → Javascript (JS) werden normalerweise keine CGI-Programme hergestellt. Javascript wird hier kurz erwähnt, weil man dynamisch veränderbare Webseiten nicht nur auf Server-Seite (mit CGI-Programmen) sondern auch auf Client-Seite (mit Javascript) programmieren kann.
Die Programmiersprache → Javascript ist in jedem gängigen Browser-Programm enthalten, d.h. am Client-PC einer/s Web-BesucherIn.
Javascript erfordert keinerlei Installation, weder am Webserver noch am Client-PC.
JS-Programme sind im Quelltext einer Webseite enthalten und werden am Client-PC (d.h. an ihrem eigenen PC) ausgeführt.
Javascript ist schnell und flexibel, jedoch in der Anwendung beschränkt: Der Zugriff auf Resourcen des eigenen PC (Dateien, Registry-Datenbank, ...) ist aus Sicherheits-Gründen verboten.
Javascript-Programme werden Live interpretiert, d.h. die Anweisungen des JS-Quelltextes werden von dem im Browser enthaltenen JS-Interpreter gelesen, übersetzt und sofort ausgeführt.

Man kann jeden Browser so konfigurieren, dass die Ausführung von Javascript Programmen verhindert wird. Die meisten Seiten dieses Webs enthalten zur Live-Demonstration der Themen Javascript-Programme, die in diesem Fall nicht ausführbar sind.
Javascript-Lösungen findet man sehr zahlreich im Internet. Man kann den JS-Quelltext in eigene Webseiten einbauen. Voraussetzung ist ein wenig Erfahrung bei der Herstellung von Webseiten.

Die Programmierung einfacher JS-Programme ist vergleichsweise leicht. AnfängerInnen können funktionierende Ergebnisse innerhalb einer Stunde erwarten. Für komplexe Programme gibt es allerdings keine zeitliche Obergrenze ...
Vergleich & Gegenüberstellung von Javascript und Server-(Script)-Programmen im nächsten ↓ Kapitel.

Details zur Entwicklung von Javascript-Programmen

Server- oder Client-Programme

Dynamische (veränderliche) Webseiten lassen sich mit unterschiedlichen Methoden herstellen.
Oft ist es möglich, eine gewünschte Funktion wahlweise mit einem Server-Programm oder mit einem Client-Programm auszuführen.
Beide Möglichkeiten werden hier verglichen:
Server-Hilfsprogramme Client-Hilfsprogramme

Perl oder PHP

sind typische Server-Programmiersprachen. Sie werden häufig als Webserver-(CGI)-Hilfsprogramme verwendet.
Die notwendigen Komponenten sind für alle gängigen Betriebssysteme kostenfrei verfügbar: (Apache) → Webserver, → Perl und → PHP.
Jede gängige Linux Server-Distribution enthält diese Komponenten, in jeder Linux Desktop-Distribution kann man sie mit Mausklick installieren.

Javascript

ist eine typische Client-Programmiersprache.
Javascript ist in jedem Browser integriert und dient am eigenen PC als Hilfsprogramm für den Browser.

Programme für Perl oder PHP

Der Quelltext ist in Dateien *.pl bzw. *.php enthalten. Man nennt solche Dateien Script-Programme, da sie aus lesbarem Text bestehen und Anweisungen für die jeweilige Programmiersprache enthalten.

Alternativ kann man CGI-Programme auch als direkt ausführbare Programme erstellen (z.B. mit C++). Diese laufen wesentlich schneller, erfordern jedoch weit mehr Aufwand für ihre Entwicklung.

Programme für Javascript

Der Quelltext ist in einem <script>-Element in den Quelltext einer HTML-Webseite *.html eingebettet. Die Programme bestehen ebenfalls aus lesbarem Text.

Optional kann man Javascript Quelltext in eigene Dateien *.js auslagern. Das hat Vorteile für wiederverwendbare Programme: Sie werden nur einmalig via Internet übertragen. Für jede weitere Anforderung (durch andere Webseiten) verwendet der Browser die Datei aus seinem lokalen Cache-Speicher.

Server-PC

Script-Programme für Perl oder PHP werden am Server-Computer ausgeführt.
Um die Programme zu nutzen, müssen diese ein Produkt erzeugen, welches an ihren PC gesendet wird, z.B. eine Webseite oder eine Grafik.

Bei mehrmals wiederholten Anforderungen müssen die erzeugten Produkte jedesmal über das Internet zum Client-PC transportiert werden.

Client-PC

Javascript-Programme werden auf ihrem eigenen PC ausgeführt. Diese Programme können unmittelbar auf ihrem PC wirksam werden, z.B. ein neues Fenster anlegen, eine Webseite laden, eine geladene Webseite ändern, etc.

Da Javascript-Programme am eigenen PC laufen, werden sie bei mehrmals wiederholter Anforderung blitzschnell ausgeführt - Es fallen keine Übertragungszeiten an.

Quelltext unsichtbar

Der Client (d.h. ihr Browser) erhält niemals das Script-Programm, sondern stets nur das damit erzeugte Produkt - meist eine HTML Webseite.
Server-Programme sind daher vor unbefugter Veränderung weitgehend sicher.

Quelltext unbeschränkt sichtbar

Alle Javascript-Anweisungen sind im Quelltext der Webseite sichtbar. Jede/r kann diese Programme für eigene Zwecke verwenden oder beliebig verändern.
Javascript kann man daher nicht für Sicherheits-kritische Anwendungen verwenden.

Langsam

Bei Verwendung von Server-Programmen ist die doppelte Übertragungszeit (Anforderung + Antwort) meist der langsamste Schritt. Es hilft nur wenig, die Server-Hardware zu beschleunigen oder die Server-Programme zu optimieren.
Live-Demo:
Neue Zufalls-Farbe mit PHP
 

Schnell

Javascript-Programme werden ungefähr gleich schnell ausgeführt wie typische Server-Programme. Allerdings entfällt die Übertragungszeit. Daher laufen Javascript-Programme in der Praxis wesentlich rascher. Das gilt besonders für wiederholt ausgeführte Programme.
Live-Demo:
Neue Zufalls-Farbe mit Javascript
 
 

Sicher

Server-Programme sind für AnwenderInnen unsichtbar und unzugänglich. Es ist nicht möglich, Server-Programme für eigene Zwecke zu kopieren, oder sie am Server zu verändern.

Sicherheits-kritische Anwendungen werden daher ausnahmslos durch Server-Programme ausgeführt.
Allerdings ist Sicherheit ein relativer Begriff - Mit entsprechendem Aufwand kann ein Angreifer jede Sicherheits-Schranke durchbrechen.

Unsicher

Javascript-Programme sind offen zugänglich und können vor Mißbrauch nicht geschützt werden.

Das bedeutet nicht, dass Javascript-Programme schädlich sein könnten, sondern dass Hersteller oder Betreiber keinen Einfluss auf die Verwendung haben: Jede/r BesucherIn kann Javascript Programme aus dem erhaltenen Quelltext kopieren und für eigene Webseiten direkt oder verändert einsetzen.

Argumente

An Server-Programme kann man bei der Anforderung individuelle Daten der/des AnwenderIn übergeben. Solche Daten (Argumente, Parameter) werden z.B. automatische durch <form> Formular-Elemente erzeugt.
Server-Programme können diese Daten lesen und entsprechend darauf reagieren.
Details und Live-Demo von Argumenten mit PHP.

Argumente

kann man mit der GET-Methode auch an Javascript-Programme übergeben.
Das ist nur wenig bekannt, funktioniert jedoch einwandfrei.
Details und Live-Demo von Argumenten mit Javascript

Server-Resourcen

Server-Programme laufen am Webserver-PC und verfügen über alle Resourcen, die dort verfügbar und erlaubt sind.

Typische Server-Resourcen sind z.B. Datenbanken.
Dynamische Webseiten sind die Standard-Methode für den Zugriff auf Datenbanken. Die Ergebnisse von Anfragen (z.B. an Suchmaschinen) können auf statischen Webseiten nicht dargestellt werden, weil darin für jede Anfrage andere Daten enthalten sind.

Client-Resourcen

Javascript-Programme laufen am eigenen (Client)-PC. Die Web-Standards erlauben aus Sicherheits-Gründen keinen Zugriff auf das eigene Dateisystem. Typische Resourcen wie Dateisystem, Windows-Registry usw. kann man daher mit Javascript-Programmen nicht erreichen.
Diese Sicherheits-Schranke ist ein wichtiger Schutz vor Missbrauch.
Auf Windows-Systemen ist es möglich, diese Schranke mit ActiveX zu ignorieren. Mittlerweile wurden Produkte wie der M$IE Browser mit unzähligen Sicherheits-Schranken ausgestattet, um diese und andere Sicherheits-Lücken wieder zu schließen.

Server-Zeit

Server-Resourcen sind ein knappes und meist relativ teures Gut. Man muss alle Möglichkeiten nutzen, um den Server zu entlasten. Jede Entlastung steigert die Server-Leistung und nutzt daher allen Clients - nicht nur jenen, die eine bestimmte dynamische Webseite anfordern.

Client Prozessor-Zeit

Am Client ist normalerweise viel ungenutzte Prozessor-Kapazität verfügbar, d.h. ihr PC muss häufig warten (z.B. auf Antworten von entfernten Webservern). Wenn man Prozessor-Arbeit von Server zum Client verlagert, verbessert sich die Geschwindigkeit meist erheblich.
Die beste Optimierung erreicht man durch kluge Verteilung der Aufgaben zwischen Server und Client. Dabei sollte man je nach gestellter Aufgabe die Vorteile nutzen und die Nachteile vermeiden. Oft ist es sinnvoll, beide Technologien miteinander zu verbinden: Der gleichbleibende Haupt-Teil einer Webseite wird z.B. als statische Datei *.html ausgelegt, darin werden dynamische Teile als Script-Programme *.pl oder *.php eingebettet.

Ausgewählte Links zum Thema 'CGI'

extropia: CGI & Perl
go2net (Paul Phillips): Safe CGI Programming - von 1995, noch immer aktuell !
NCSA: Writing secure CGI scripts
Wikipedia: Common Gateway Interface
XHTML CSS