de.comp.lang.php.* FAQ

4.5. Was ist --enable-force-cgi-redirect? Warum enthält $_SERVER['PHP_SELF'] den Pfad zum CGI-Interpreter?

Antwort von Kristian Köhntopp

Wenn CGI-PHP eingesetzt wird, bekommt der Interpreter den Pfad zum PHP-Script in der CGI-Variablen $_SERVER['PATH_INFO'] übergeben. Der Aufruf eines PHP-Scriptes erfolgt also mit Hilfe einer URL der Form

http://www.example.com/cgi-bin/php/somedir/somescript.php

Der PHP-Interpreter wird dabei unter der URL http://www.example.com/cgi-bin/php erreicht und die Variable $_SERVER['PATH_INFO'] erhält den Wert /somedir/somescript.php. Der PHP-Interpreter greift sich den Wert der Konfigurationsvariablen document_root aus der php.ini und setzt den Dateinamen des Scriptes aus dieser Variablen und $_SERVER['PATH_INFO'] zusammen.

Dies ist natürlich gefährlich, denn ein böswillger Anwender könnte jetzt anfangen, Scripte wie folgt aufzurufen:

http://www.example.com/cgi-bin/php/../../../../../etc/passwd

Der PHP-Interpreter würde nun anfangen, die passwd-Datei als Script zu laden und auszuführen, d.h. die Passwort-Datei auszugeben. Auf diese Weise kann man prinzipiell auf jede Datei im System zugreifen, sofern diese durch den Benutzer lesbar ist, unter dessen UID der Interpreter abläuft.

Übersetzt man CGI-PHP mit der Konfigurationsoption enable-force-cgi-redirect, funktioniert dies nicht mehr. PHP startet in diesem Fall nur noch, wenn die CGI-Umgebungsvariable $_SERVER['REDIRECT_STATUS'] gesetzt ist (der Wert der Variablen ist egal). Der Apache Server setzt diese Variable, wenn der Zugriff auf das CGI-Verzeichnis die Folge eines eines serverinternen Redirect ist. Üblicherweise konfiguriert man seinen Webserver dann so:

  Action     php-script /cgi-bin/php
  AddHandler php-script .php

Die Direktive AddHandler bildet die Endung .php auf den Handler php-script (der Name ist frei wählbar, solange er eindeutig ist) ab. Die Direktive Action deklariert eine externe Aktion, die durch ein CGI-Programm realisiert wird. In Kombination bewirken beide Direktiven, dass alle Zugriffe auf Dateien mit der Endung .php auf das CGI-Programm /cgi-bin/php redirected werden. Dies erzeugt als Nebenwirkung genau die benötigte $_SERVER['REDIRECT_STATUS']-Variable.

Die beiden Apache-Konfigurationsdirektiven bewirken, dass Dateien mit der Endung .php im PHP-Interpreter landen und die Abfrage auf die $_SERVER['REDIRECT_STATUS']-Variable bewirkt, dass ein direkter Aufruf des PHP-Interpreters mit einem manipulierten $_SERVER['PATH_INFO'] nicht mehr möglich ist. In Kombination stellen beide Mechanismen ein vernünftiges Maß an Sicherheit her.

PHP berechnet nun den Wert der Variablen $_SERVER['PHP_SELF'] auf andere Weise, falls enable-force-cgi-redirect in Kraft ist: In diesem Fall enthält die Variable wirklich nur den Namen des Scriptes ohne den Pfad zum PHP-Interpreter. Ist der Interpreter jedoch ohne diese Einstellung übersetzt worden, ist der Name des PHP-Interpreters Bestandteil von $_SERVER['PHP_SELF']. Dies ist ein Hinweis auf ein schweres Sicherheitsproblem. Der Interpreter sollte ausgetauscht werden durch eine Version, die mit enable-force-cgi-redirect übersetzt wurde.

Manche Webserver sind nicht in der Lage, Endungen auf CGI-Programme zu mappen (beim Netscape Server kann man dies mit Hilfe eines Plugin-Modules nachrüsten) oder sie erzeugen keine $_SERVER['REDIRECT_STATUS']-Variable, wenn sie ein solches Mapping vorgenommen haben. In diesem Fall muss man ohne enable-force-cgi-redirect arbeiten und mit dem Sicherheitsloch leben oder - besser - den Webserver wechseln.

Valid HTML 4.01! Valid CSS!

4.5. Was ist --enable-force-cgi-redirect? Warum enthält $_SERVER['PHP_SELF'] den Pfad zum CGI-Interpreter?
http://www.php-faq.de/q/q-konfiguration-cgi.html
Archiv der de.comp.lang.php-FAQ Dies ist eine Archivseite von 2008 und wurde seitdem nicht geändert. Das dclp-FAQ-Team