Der abgesicherte Modus von PHP wurde eingerichtet, um das Sicherheitsproblem von Shared-Servern zu lösen. Strukturell macht es keinen Sinn, dieses Problem auf der PHP-Ebene zu lösen, aber eine Änderung der Webserver- und Betriebssystemebene erscheint sehr unrealistisch. Viele Leute, insbesondere ISPs, verwenden derzeit den abgesicherten Modus.
Im Folgenden sind die Einstellungen für den abgesicherten Modus in php.ini aufgeführt:
safe_mode boolean
Gibt an, ob der abgesicherte Modus von PHP aktiviert werden soll.
safe_mode_gid boolean
Standardmäßig führt der abgesicherte Modus beim Öffnen einer Datei eine UID-Vergleichsprüfung durch. Wenn Sie den GID-Vergleich vereinfachen möchten, aktivieren Sie „safe_mode_gid“. Ob UID (FALSE) oder GID (TRUE) zur Prüfung beim Zugriff auf Dateien verwendet werden soll.
safe_mode_include_dir string
UID/GID-Prüfungen umgehen, wenn Dateien aus diesem Verzeichnis und seinen Unterverzeichnissen eingebunden werden (Verzeichnisse müssen im include_path enthalten oder mit vollständigen Pfaden eingebunden sein).
Ab PHP 4.2.0 kann diese Direktive durch Doppelpunkte (Semikolons unter Windows) getrennte Pfade in einem ähnlichen Stil wie die include_path-Direktive anstelle nur eines Verzeichnisses akzeptieren. Der angegebene Grenzwert ist eigentlich ein Präfix und kein Verzeichnisname. Das bedeutet, dass „safe_mode_include_dir = /dir/incl“ den Zugriff auf „/dir/include“ und „/dir/incls“ ermöglicht, sofern vorhanden. Wenn Sie den Zugriff auf ein bestimmtes Verzeichnis beschränken möchten, fügen Sie einen abschließenden Schrägstrich hinzu, zum Beispiel: „safe_mode_include_dir = /dir/incl/“. Wenn der Wert dieser Direktive leer ist, werden Dateien mit unterschiedlicher UID/GID in PHP 4.2.3 und ab PHP 4.3.3 nicht einbezogen. In früheren Versionen konnten alle Dateien eingebunden werden.
safe_mode_exec_dir string
Wenn PHP den abgesicherten Modus verwendet, verweigern system() und andere Programmausführungsfunktionen den Start von Programmen, die sich nicht in diesem Verzeichnis befinden. Muss / als Verzeichnistrennzeichen verwenden, auch unter Windows.
safe_mode_allowed_env_vars string
Das Festlegen bestimmter Umgebungsvariablen kann eine potenzielle Sicherheitslücke darstellen. Diese Direktive enthält eine durch Kommas getrennte Liste von Präfixen. Im abgesicherten Modus können Benutzer nur Umgebungsvariablen ändern, deren Namen das hier angegebene Präfix haben. Standardmäßig können Benutzer nur Umgebungsvariablen festlegen, die mit PHP_ beginnen (z. B. PHP_FOO = BAR).
Hinweis:
Wenn diese Anweisung leer ist, erlaubt PHP dem Benutzer, jede Umgebungsvariable zu ändern!
safe_mode_protected_env_vars string
Diese Direktive enthält eine durch Kommas getrennte Liste von Umgebungsvariablen, die Endbenutzer nicht mit putenv() ändern können. Diese Variablen können nicht geändert werden, selbst wenn in „safe_mode_allowed_env_vars“ zulässige Änderungen festgelegt sind.
Wenn „safe_mode“ aktiviert ist, prüft PHP anhand der Dateifunktion oder ihres Verzeichnisses, ob der Eigentümer des aktuellen Skripts mit dem Eigentümer der zu bearbeitenden Datei übereinstimmt. Zum Beispiel:
-rw-rw-r-- 1 rasmus rasmus 33 Jul 1 19:20 script.php -rw-r--r-- 1 root root 1116 May 26 18:01 /etc/passwd
Run script.php
<?php readfile('/etc/passwd'); ?>
Wenn der abgesicherte Modus aktiviert ist, wird der folgende Fehler ausgegeben:
Warning: SAFE MODE Restriction in effect. The script whose uid is 500 is not allowed to access /etc/passwd owned by uid 0 in /docroot/script.php on line 2
Gleichzeitig , vielleicht gibt es Umgebungen, in denen eine lockere GID-Prüfung ausreicht, eine strenge UID-Prüfung jedoch unangemessen ist. Diese Prüfung kann mit der Option „safe_mode_gid“ gesteuert werden. Bei der Einstellung „Ein“ wird eine entspannte GID-Prüfung durchgeführt; bei der Einstellung „Aus“ (Standard) wird eine UID-Prüfung durchgeführt.
Wenn mit Ausnahme von „safe_mode“ die Option „open_basedir“ festgelegt ist, sind alle Dateivorgänge auf das angegebene Verzeichnis beschränkt. Zum Beispiel:
<Directory /docroot> php_admin_value open_basedir /docroot </Directory>
Wenn Sie nach dem Setzen der open_basedir-Option dieselbe script.php ausführen, lautet das Ergebnis:
Warning: open_basedir restriction in effect. File is in wrong directory in /docroot/script.php on line 2
Sie können bestimmte Funktionen auch einzeln blockieren. Bitte beachten Sie, dass die Option „disable_functions“ nicht außerhalb der Datei „php.ini“ verwendet werden kann, was bedeutet, dass Funktionen nicht durch verschiedene virtuelle Hosts oder verschiedene Verzeichnisse in der Datei „httpd.conf“ blockiert werden können. Wenn Sie den folgenden Inhalt zur php.ini-Datei hinzufügen:
disable_functions readfile,system
erhalten Sie die folgende Ausgabe:
Warning: readfile() has been disabled for security reasons in /docroot/script.php on line 2
Warnung
Diese PHP-Einschränkungen gelten natürlich nicht Auf ausführbare Dokumente anwenden.