Features
PHP Manual

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 
safe_mode_gid = 0
safe_mode_include_dir = 
safe_mode_exec_dir = 
open_basedir = 
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!

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 Eigentümer haben wie das Skript selbst.
dbase_open() Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID Eigentümer haben wie das Skript selbst.
filepro() Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID Eigentümer haben wie das Skript selbst.
filepro_rowcount() Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID Eigentümer haben wie das Skript selbst.
filepro_retrieve() Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID Eigentümer 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 Eigentümer haben wie das Skript selbst.
posix_mkfifo() Überprüft ob das Verzeichnis in dem das Skript ausgeführt werden soll, die gleiche UID (Eigentümer) 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 Eigentümer haben wie das Skript selbst.
chdir() Überprüft ob das Verzeichnis in dem das Skript ausgeführt werden soll, die gleiche UID (Eigentümer) hat wie das Skript selbst.
dl() Diese Funktion steht im Safe Mode nicht zur Verfügung.
backtick operator Diese Funktion steht im Safe Mode nicht zur Verfügung.
shell_exec() (funktional gleichwertig zu den Backtick-Operatoren) Diese Funktion steht im Safe Mode nicht zur Verfügung.
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 (Eigentümer) hat wie das Skript selbst.
rmdir() Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID Eigentümer haben wie das Skript selbst.
rename() Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID Eigentümer haben wie das Skript selbst. Überprüft ob das Verzeichnis in dem das Skript ausgeführt werden soll, die gleiche UID (Eigentümer) hat wie das Skript selbst.
unlink() Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID Eigentümer haben wie das Skript selbst. Überprüft ob das Verzeichnis in dem das Skript ausgeführt werden soll, die gleiche UID (Eigentümer) hat wie das Skript selbst.
copy() Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID Eigentümer haben wie das Skript selbst. Überprüft ob das Verzeichnis in dem das Skript ausgeführt werden soll, die gleiche UID (Eigentümer) 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 Eigentümer haben wie das Skript selbst.
chown() Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID Eigentümer haben wie das Skript selbst.
chmod() Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID Eigentümer 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 Eigentümer haben wie das Skript selbst. Überprüft ob das Verzeichnis in dem das Skript ausgeführt werden soll, die gleiche UID (Eigentümer) hat wie das Skript selbst.
symlink() Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID Eigentümer haben wie das Skript selbst. Überprüft ob das Verzeichnis in dem das Skript ausgeführt werden soll, die gleiche UID (Eigentümer) 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 Eigentümer haben wie das Skript selbst. Überprüft ob das Verzeichnis in dem das Skript ausgeführt werden soll, die gleiche UID (Eigentümer) 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()!
highlight_file(), show_source() Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID Eigentümer haben wie das Skript selbst. Überprüft ob das Verzeichnis in dem das Skript ausgeführt werden soll, die gleiche UID (Eigentümer) hat wie das Skript selbst. (Hinweis: gilt nur ab Version PHP 4.2.1)
Jede Funktion, die php4/main/fopen_wrappers.c benutzt... ??


Features
PHP Manual