Was ist das?
Unter CGI versteht man Programme die auf dem Webserver ausgeführt
werden. Häufig erhalten diese Programme Eingaben vom einem Benutzer
und senden die Ausgabe wieder zurück an den Benutzer.
Auf dem RhoneWeb stehen Ihnen eine Vielzahl von standard CGI's zur
Verfügung ohne dass Sie programmieren müssen. Anleitungen
und Beispiele für diese CGI finden Sie hier.
Möchten Sie eigene CGI programmieren so erhalten Sie als Option
zu einem RhoneWeb "Webserver" ein "cgi-local"
Verzeichnis. In dieses Verzeichnis können Sie eigene CGI Programme
speichern und diese dann über einen Browser aufrufen.
Die Aufgabe eines CGI-Programmes kann man grundsätzlich so einteilen
- Empfangen
von Benutzerdaten (beim Aufruf)
- Verarbeiten
dieser Benutzerdaten
- Ausgabe
von Daten über den Web-Server
Das Common Gateway
Interface ist der Standard für den Datenaustausch und auf keine spezielle
Programmiersprache festgelegt. Auf dem RhoneWeb können Sie Ihre
CGI's in Perl, Shell (Bash) oder kompiliert (ELF i386) ausführen
lassen.
Der CGI-Output umfasst alle denkbaren Dokumenttypen; neben einfachen
HTML-Dokumenten können auch Video-Clips, Audio-Daten und vieles mehr
zum Client zurückgeschickt werden. Dabei kann man entweder den Output
dynamisch durch das CGI-Programm erzeugen (virtuelles Dokument), oder
den Server durch Umleitung (Server Redirection) auf bestehende Ressourcen
zugreifen lassen. Mithilfe der Interaktion zwischen Client und Server
via CGI können somit dynamische Dokumente erstellt werden.
Vorteile von cgi-local
Neben den RhoneWeb standard CGI's im cgi-bin
können Sie in einem cgi-local eigene CGI ausführen lassen.
Auf was ist zu achten?
- CGI Programme
werden aus Sicherheitsgründen nur im Unterverzeichnis /cgi-local
ausgeführt. Kopieren Sie die Programme dorthin und ändern
Sie die Zugriffsrechte z.B. auf 755 damit
das Script ausgeführt werden darf.
- Die CGI
Programme werden mit Ihren Benutzerrechten (owner) und den Gruppenrechten
nogroup id=65534 ausgeführt. Der Webserver läuft mit
den Gruppenrechten wwwgroup id=102.
- Alle CGI
Programme werden über einen Wrapper (sbox), in einem chroot
ausgeführt und haben nur eingeschränkte Systemresourcen
zur Verfügung. Der Wrapper führt einige Sicherheitskontrollen
durch. Sollte etwas nicht stimmen so erscheint im Browser eine
Fehlermeldung des Wrappers.
- Es ist wichtig,
daran zu erinnern, dass Unix case-empfindlich ist und dass "Index.htm"
nicht dasselbe ist wie "index.htm".
- Schreiben
Sie alle Datei- und Verzeichnisnahmen in Kleinschrift - das minimiert
Tippfehler.
- Schreiben
Sie alle Systembefehle in Kleinschrift.
- Korrigieren
Sie falls nötig den Pfad für Perl und Bash-Programme
laut den Angaben weiter unten.
- Kontrollieren
und löschen Sie ihre Fehlerlogdatei regelmässig! Wenn
diese Datei /logs/httpd.errors grösser als das unter Resourcen
erlaubte Maximum wird, so können keine CGI Programme mehr
ausgeführt werden.
- Achten Sie
auf die Sicherheitstipps!
Sicherheit
Sicherheitslücken sind in einem System nie vollständig auszuschliessen.
Leider gibt es im Zusammenhang mit CGI und Formularen Mängel, die
potentielle Risiken darstellen. Da auf dem RhoneWeb alle CGI-Programme
in einer Art Sandbox (chroot) laufen, gefährden Sie bei einer
unvorsichtigen Programmierung vor allem Ihre eigenen Dateien und Programme.
Beachten Sie folgende Punkte bei allen Ihren CGI Programmen:
- Löschen Sie alle nicht benötigten CGI-Programme. Insbesondere unsere "env-cgi-local", "errorlog.pl" sowie "sendmail-bsp2.pl" - falls diese benötigt werden, empfehlen wir diese umzubenennen.
- Trauen Sie keinen Angaben die vom Browser kommen.
Insbesondere muss z.B. die maximale Länge eines Formularfeldes
nicht gleich sein wie die maximale Länge der erhaltenen Zeichenkette.
Ein Hidden-Wert kann verändert zurück kommen.
Der Surfer kann z.B. Kommandos (Befehle) statt z.B. seinen Namen
in ein Gästebuch schreiben.
etc.
- Prüfen Sie alle Benutzereingaben vor der weiteren Verwendung
auf erlaubte Zeichen.
- Benutzen Sie in Perl die Option "-T" und "use
scrict".
- Wenn Sie Befehle wie "exec", "system", "eval",
"popen", "piped open" etc benutzen, so überprüfen
Sie jeden übergebenen Wert. Wenn möglich benutzen Sie
Anführungszeichen wie folgt:
system("grep", "-e", $exp, "database");
Achtung: Wenn Sie die Hilfsprogramme zum Anschauen der Logdateien
und der Umgebungsvariabeln "errorlog.pl" und "env-cgi-local"
nicht mehr benötigen, sollten Sie diese Daten löschen oder
Umbenennen.
Debuggen / Loggen
Im Verzeichnis "/logs" stehen die Zugriffsdaten für
den letzten Tag in der Datei "httpd.access_old" zur Verfügung.
Diese Daten werden automatisch und täglich in eine aussagekräftige
Webstatistik verarbeitet.
Interessant für das Auffinden von Problemen mit Programmen im
cgi-local Verzeichnis ist die Datei "/logs/httpd.error".
In dieser Datei werden alle Fehlermeldungen der Programme im cgi-local
gespeichert. Man kann diese Logdatei über ein vorhandenes CGI-Programm
"errorlog.pl" anschauen. Rufen Sie einfach http://www.dein-name.ch/cgi-local/errorlog.pl
in einem Browser auf.
Die Umgebungsvariabeln können mit dem vorhandenen CGI-Programm
"env-cgi-local" angeschaut werden. Rufen Sie dazu http://www.dein-name.ch/cgi-local/env-cgi-local
in einem Browser auf.
Mit einem zusätzlichen Shell-Konto können Sie die Programme
auch direkt von der Kommandozeile aus aufrufen und Fehlermeldungen
direkt sehen. Die Umgebungsvariabeln müssen dazu aber im Script
angepasst werden.
Der Wrapper führt eine Vielzahl von Sicherheitskontrollen durch
noch bevor das CGI Programm überhaupt gestart wird.
Wenn eine dieser Kontrollen oder auch die Laufzeitresourcen überschritten
werden erscheint eine Fehlermeldung.
Laufzeitresourcen
Die folgenden
Resourcen können von CGI Pogrammen nicht überschritten werden.
Bei Überschreitung wird das CGI Programm gestoppt und der Webserver
sendet den Fehler 500 .
| Resource |
Softlimit |
Hardlimit |
| CPU Time |
10 Sek |
120 Sek |
| In Memory
Data |
1 MByte |
8 MByte |
| Stack
Size |
1 MByte |
8 MByte |
| No Core
Dumps |
Ja |
Ja |
| Resident
Set Memory |
1 MByte |
8 MByte |
| Number
or Processes Spawned |
32 |
64 |
| File descriptors |
32 |
64 |
| Maximum
Filesize |
5 MByte |
10 MByte |
Umgebung
Die Umgebung für die CGI's im cgi-local ist eine minimale Linux-Shell
Umgebung. Es stehen nur die für das Ausführen von CGI Programmen
(Perl, Shell, Binär) nötigen Programme und Bibliotheken
zur Verfügung.
Folgende Verzeichnisse befinden sich im Root dieser Umgebung:
| Verzeichnis |
Zweck |
Rechte |
| /htdocs |
Enthält
alle Webseiten, am Anfang nur ein index.html mit Welcome |
Alle Rechte |
| /cgi-local |
Enthält
alle Perl und Binary CGIs, am Anfang nur sbox, errorlog.pl und
env-cgi-local |
Alle Rechte |
| /logs |
Enhält
Logfiles und die Konfiguration zur Webstatistik |
Nur lesen |
| /bin |
Systemprogramme |
Nur
soweit nötig lesen oder ausführen. |
| /dev |
Systemdevices |
| /etc |
Konfigurationsdateien
für System-Programme |
| /lib |
Bibliotheken |
| /root |
Homeverzeichnis
für Benutzer root |
| /var |
Daten
der Systemprogramme |
| /usr |
Systemprogramme
speziell für/vom Benutzer |
| /home |
Homeverzeichnis
für den oder die Benutzer |
Alle Rechte
im Unterverzeichnis |
| /tmp |
Für
temporäre Dateien |
Alle Rechte |
Programme
In der chroot Umgebung steht nur eine beschränkte Anzahl von
Programmen zur Verfügung. Diese Programme dienen vor Allem
dem Ausführen von CGI's für den Webserver.
U.a. sind diese Programme vorhanden:
- bash
- tail
- head
- less
- gzip
- tar
- id
- perl
- htpasswd2
- convert
- composite
- identify
- mysql
- which
- date
- more
- /usr/sbin/sendmail (oder /usr/lib/sendmail)
Achtung:
/usr/bin/sendmail ist nicht das original sendmail programm, sondern
ein Script das sich verhält wie sendmail. Die folgenden sendmail
Optionen werden unterstützt: -t, -f, -F und -i
Neben sendmail kann man Emails auch über die Perl Bibliothek
Net::SMTP versenden.
Achtung: Häufig ist die erste Zeile eines Perl- oder Shell-Programmes
der Pfad zum Interpreter (also Perl oder Bash). Korrigieren Sie gegebenenfalls
diese Pfade laut den Angaben oben.
Umgebungsvariablen
Zahlreiche Variablen können vorhanden sein und es können eigene
erzeugt werden. Hier eine typische Auswahl:
| Variablen
Name |
Variablen
Beschreibung |
Beispiel
Wert |
| DOCUMENT_NAME |
aktueller
Dateiname |
ssi.shtm
|
| DOCUMENT_URI |
Der virtuellePfad
zu diesem Dokument |
/service/ssi.shtm |
| QUERY_STRING_UNESCAPED |
Suchbegriff
den der Client gesandt hat. |
(none) |
| DATE_GMT |
Datum
und Uhrzeit
(Greenwich GMT) |
Tuesday,
18-Dec-2001 13:59:15 GMT |
| LAST_MODIFIED |
Datum
der letzten Änderung |
Saturday,
22-May-1999 11:48:48 PDT |
| DATE_LOCAL |
Das aktuelle
Datum in der mit config und timefmt
definierten Ausgabe |
Tuesday,
18-Dec-2001 05:59:15 PST |
| REMOTE_ADDR |
Die IP-Nummer
des Benutzers der diese Seite betrachtet (Ihre!) |
195.65.53.80 |
| REMOTE_HOST |
Der Domainname
(oder IP )des Benutzers |
(none) |
| SERVER_URL |
Der Name
des WWW-Servers der diese Seite anzeigt |
(none)
|
| HTTP_USER_AGENT |
Der von
Ihnen verwendete Browser |
Mozilla/4.0
(compatible; MSIE 6.0; Windows 98; Q312461) |
|