dclp FAQ

FAQ der Newsgroups de.comp.lang.php.*

 
  • Increase font size
  • Default font size
  • Decrease font size

Sicheres Programmieren in PHP

Was genau bewirkt safe_mode und ist das sicher?

E-MailDruckenPDFLesezeichen anlegen: Du musst dich einloggen um ein Lesezeichen für diesen Beitrag anzulegen. Es wird deiner persönlichen Lesezeichenliste hinzugefügt.

Die hier aufgeführte Liste basiert auf einer Analyse einer bestimmten, inzwischen veralteten Version des PHP-Sourcecodes. Die grundsätzlichen Informationen sind korrekt, aber die Liste der einzelnen Teileinschränkungen dürfte nicht mehr abschließend sein.

Es gibt eine Konfigurationsvariable safe_mode, die in der php.ini gesetzt werden kann. Weiterhin gibt es die Konfigurationsvariablen safe_mode_exec_dir und sql_safe_mode.

Wenn safe_mode aktiv ist, sind verschiedene PHP-Funktionen privilegiert oder eingeschränkt. Zumeist gilt die safe_mode Einschränkung, dass auf eine Datei oder ein Verzeichnis nur eingewirkt werden darf, wenn die Datei oder das Verzeichnis denselben Eigentümer hat wie das Script. Im Einzelnen:

  • Alle Dateifunktionen einschließlich include() und require() können nur noch mit lokalen Dateien arbeiten, die denselben Eigentümer (uid) haben wie der Eigentümer des Scriptes.

  • Lokalen, absoluten Pfadnamen wird document_root vorangestellt.

  • In den Funktionen popen(), system() und exec() können nur Kommandos ausgeführt werden, die im safe_mode_exec_dir stehen. Auf die ausgeführten Kommandos wird von den Funktionen popen(), system() und exec() automatisch EscapeShellCmd() angewendet.

  • Dynamisch ladbare Erweiterungen (dl()-Funktion) stehen in safe_mode nicht zur Verfügung ("Dynamically loaded extensions aren't allowed when running in SAFE MODE.").

  • Es kann kein neues CPU-Zeitlimit festgelegt werden ("Cannot set time limit in safe mode").

  • Wird mod_php verwendet, steht in der Funktion getallheaders() der Wert des Headers "Authorization" (Loginname und Passwort) nicht zur Verfuegung.

  • Die Funktion header() wird dem Header "WWW-authenticate" immer den Eigentümer des Scriptes als Bestandteil des Realms hinzufügen.

  • Das filepro Map-File "dir/map" (wobei dir der Parameter der filepro()-Funktionen ist) muss die Einschränkung erfüllen. Dies gilt für filepro(), filepro_rowcount() und filepro_retrieve().

  • Das dbase-Modul verlangt in dbase_open() und dbase_create(), dass die dbf-Datei die Einschränkung erfüllt.

  • Das DBM-Modul setzt voraus, dass in dbmopen() das Verzeichnis, in dem die DBM-Datenbank angelegt wird, die Einschränkung erfüllt. Dies ist bei den DBA-Funktionen nicht der Fall.

Wenn sql_safe_mode aktiv ist, können bei einem MySQL-Connect host, user und password nicht angegeben werden ("SQL safe mode in effect - ignoring host/user/password information").

safe_mode ist nicht sicher: Ein Fehler in der popen()-Funktion ist erst mit 3.0.14 korrigiert worden, ein weiterer Fehler in der mail()-Funktion erst in 3.0.15. Spätere Versionen von PHP hatten weitere Lücken. Man sollte stattdessen die CGI-Version in einem chroot-Environment verwenden und mit setrlimit noch weitergehende Einschränkungen definieren.

Was genau bewirkt safe_mode und ist das sicher?
http://www.php-faq.de/q-konfiguration-safe-mode.html
 

Login