PHP Handbuch
Zurück |  | Nach vorne

# Kapitel 23. Safe Mode

Safe Mode ist der Versuch, Sicherheitsprobleme bei gemeinsam genutzten Servern zu lösen. Bezogen auf die Systemarchitektur, ist es der falsche Ansatz, diese Probleme innerhalb der PHP Schicht lösen zu wollen. Da es auf Ebene des Webservers bzw. des Betriebssystems keine praktischen Alternativen gibt, wird Safe Mode nunmehr von vielen Leuten, vor allem von Providern, eingesetzt.

Es existieren folgende Direktiven um Safe Mode zu konfigurieren:

    safe_mode = Off
    open_basedir =
    safe_mode_exec_dir =
    safe_mode_allowed_env_vars = PHP_
    safe_mode_protected_env_vars = LD_LIBRARY_PATH
    disable_functions =

Wenn safe_mode aktiviert ist, überprüft PHP, ob der Eigentümer des laufenden Skriptes dem Eigentümer der Datei entspricht, an der mit Hilfe der Dateifunktionen gearbeitet werden soll. 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

Bei der Ausführung dieses Skriptes

    <?php
     readfile('/etc/passwd');
    ?>

erscheint bei aktiviertem Safe Mode folgende Warnung:

    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

Wenn anstelle von safe_mode ein open_basedir Verzeichnis angegeben wurde, können Dateioperationen nur noch unterhalb dieses Verzeichnisses vorgenommen werden. Beispiel (Apache httpd.conf):

    <Directory /docroot>
    php_admin_value open_basedir /docroot
    </Directory>

Wenn das Skript script.php mit der open_basedir Einstellung ausgeführt wird, erscheint folgende Warnung:

    Warning: open_basedir restriction in effect. File is in wrong directory in
    /docroot/script.php on line 2

Darüberhinaus können einzelne Funktionen deaktiviert werden. Würde man folgenden Eintrag in der php.ini vornehmen:

    disable_functions readfile,system

Würde diese Warnung erscheinen:

    Warning: readfile() has been disabled for security reasons in
    /docroot/script.php on line 2

# Funktionen, die durch Safe Mode deaktiviert oder eingeschränkt werden

Dies ist eine Auflistung der Funktionen, die durch Safe Mode eingeschränkt werden. Diese Liste ist möglicherweise unvollständig und fehlerhaft!

Tabelle 23-1. Durch Safe Mode eingeschränkte Funktionen

Funktion | Einschränkungen
--- | ---
dbmopen() | Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID haben wie das Skript selbst.
dbase_open() | Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID haben wie das Skript selbst.
filepro() | Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID haben wie das Skript selbst.
filepro_rowcount() | Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID haben wie das Skript selbst.
filepro_retrieve() | Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID haben wie das Skript selbst.
ifx_*() | sql_safe_mode restrictions, (!= Safe Mode)
ingres_*() | sql_safe_mode restrictions, (!= Safe Mode)
mysql_*() | sql_safe_mode restrictions, (!= Safe Mode)
pg_loimport() | Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID haben wie das Skript selbst.
posix_mkfifo() | Überprüft ob das Verzeichnis in dem das Skript ausgeführt werden soll, die gleiche UID hat wie das Skript selbst.
putenv() | Führt die safe_mode_protected_env_vars und safe_mode_allowed_env_vars ini-directiven aus. Siehe auch Dokumentation zu putenv()
move_uploaded_file() | Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID haben wie das Skript selbst.
chdir() | Überprüft ob das Verzeichnis in dem das Skript ausgeführt werden soll, die gleiche UID hat wie das Skript selbst.
dl() | Diese Funktion ist bei Verwendung von Safe Mode deaktiviert.
backtick operator | Diese Funktion ist bei Verwendung von Safe Mode deaktiviert.
shell_exec() (funktional gleichwertig zu den Backtick-Operatoren) | Diese Funktion ist bei Verwendung von Safe Mode deaktiviert.
exec() | Ausführbare Dateien können nur innerhalb des durch safe_mode_exec_dir angegebenen Verzeichnisses ausgeführt werden. Aus praktischen Gründen ist es momentan nicht erlaubt, `..` im Pfad zu den ausführbaren Datein anzugeben.
system() | Ausführbare Dateien können nur innerhalb des durch safe_mode_exec_dir angegebenen Verzeichnisses ausgeführt werden. Aus praktischen Gründen ist es momentan nicht erlaubt, `..` im Pfad zu den ausführbaren Datein anzugeben.
passthru() | Ausführbare Dateien können nur innerhalb des durch safe_mode_exec_dir angegebenen Verzeichnisses ausgeführt werden. Aus praktischen Gründen ist es momentan nicht erlaubt, `..` im Pfad zu den ausführbaren Datein anzugeben.
popen() | Ausführbare Dateien können nur innerhalb des durch safe_mode_exec_dir angegebenen Verzeichnisses ausgeführt werden. Aus praktischen Gründen ist es momentan nicht erlaubt, `..` im Pfad zu den ausführbaren Datein anzugeben.
mkdir() | Überprüft ob das Verzeichnis in dem das Skript ausgeführt werden soll, die gleiche UID hat wie das Skript selbst.
rmdir() | Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID haben wie das Skript selbst.
rename() | Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID haben wie das Skript selbst. Überprüft ob das Verzeichnis in dem das Skript ausgeführt werden soll, die gleiche UID hat wie das Skript selbst.
unlink() | Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID haben wie das Skript selbst. Überprüft ob das Verzeichnis in dem das Skript ausgeführt werden soll, die gleiche UID hat wie das Skript selbst.
copy() | Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID haben wie das Skript selbst. Überprüft ob das Verzeichnis in dem das Skript ausgeführt werden soll, die gleiche UID hat wie das Skript selbst. (on `source` and `target`)
chgrp() | Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID haben wie das Skript selbst.
chown() | Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID haben wie das Skript selbst.
chmod() | Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID haben wie das Skript selbst. In addition, you cannot set the SUID, SGID and sticky bits
touch() | Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID haben wie das Skript selbst. Überprüft ob das Verzeichnis in dem das Skript ausgeführt werden soll, die gleiche UID hat wie das Skript selbst.
symlink() | Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID haben wie das Skript selbst. Überprüft ob das Verzeichnis in dem das Skript ausgeführt werden soll, die gleiche UID hat wie das Skript selbst. (note: only the target is checked)
link() | Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID haben wie das Skript selbst. Überprüft ob das Verzeichnis in dem das Skript ausgeführt werden soll, die gleiche UID hat wie das Skript selbst. (note: only the target is checked)
getallheaders() | Header die mit 'authorization' (unabhängig von Groß- oder Kleinschreibung) beginnen, werden bei Verwendung von Safe Mode nicht zurückgegeben. Achtung: Dies ist fehlerhaft bei der AOL-Server Implementation der Funktion getallheaders()!
Jede Funktion, die `php4/main/fopen_wrappers.c` benutzt... | ??

Zurück | Zum Anfang | Nach vorne
Persistente Datenbankverbindungen | Nach oben | Funktionsreferenz