cgi-local

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
  1. Empfangen von Benutzerdaten (beim Aufruf)
  2. Verarbeiten dieser Benutzerdaten
  3. 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)