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
<?php
readfile('/etc/passwd');
?>
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>
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
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!
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... | ?? |