phpbar.de logo

Mailinglisten-Archive

[php] passthru

[php] passthru

Markus Dobel m_(at)_rkus.dobel.de
Tue, 18 Jan 2000 13:23:14 +0100


Jan Kocovski wrote:
> 
> Hi,
> es koennte sein das save mode an ist.
> a.) wie pruefe ich das?

mit einem script wie <? phpinfo(); ?>

> b.) wie schalte ich ihn aus

in der php3.ini:    safe_mode = On | Off
in der apache-conf: php3_safe_mode = On | Off

nicht jedoch in einer .htaccess-datei und ebenfalls nicht per
php-script, da diese moeglichkeiten den sinn des safe-mode ad absurdum
fuehren wuerden.

> c.) was bewirkt er ueberhaupt

dazu eine antwort von kristian:

--- beisskante ---

Zu safe_mode gibt es keine aktuelle Dokumentation ausser dem
Source. Der sagt:

Es gibt eine Konfigurationsvariable safe_mode in PHP3, die durch
die gleichnamige Anweisung in der php3.ini gesetzt werden kann
("safe_mode = On" bzw. "php3_safe_mode On"). 

Weiterhin gibt es eine Konfigurationsvariable
"safe_mode_exec_dir" bzw. "php3_safe_mode_exec_dir" fuer die
Modulversion von PHP3. 

Und schliesslich gibt es noch "sql_safe_mode"...


Wenn safe_mode aktiv ist, sind verschiedene PHP3-Funktionen
privilegiert oder eingeschraenkt:

- Dateifunktionen koennen nur noch mit lokalen Dateien arbeiten,
  die denselben Eigentuemer (uid) haben wie der Eigentuemer des
  Scriptes. 
  - Auch ftp-Pfadnamen werden so geprueft.
  - Auf zlib-Pfadnamen werden so geprueft.
  - mkdir() und posix_mkfifo() sind nur in Verzeichnissen
    zugelassen, die dem Eigentuemer des Scriptes gehoeren.
  - Das Ziel eines symlink() (Parameter 1 von symlink()) muss
    dem Eigentuemer des Scriptes gehoeren.
  - Das Ziel eines link() (Parameter 1 von link()) muss dem
    Eigentuemer des Scriptes gehoeren.
  - Die zu unlink()ende Datei muss dem Eigentuemer...
  - Eine zu chgrp()ende Datei muss dem Eigentuemer...
  - Eine zu chown()ende Datei muss dem Eigentuemer...
  - Eine zu chmod()ende Datei muss dem Eigentuemer...
  - Eine zu touch()ende Datei muss dem Eigentuemer...
  - Ein zu rmdir()endes Verzeichniss muss dem Eigentuemer...
  - In rename() muss die umzubenennende Datei dem Eigentuemer...
  - In copy() muss die Quelldatei dem Eigentuemer...

- Lokalen, absoluten Pfadnamen wird document_root vorangestellt.

- In den Funktionen popen(), system() und exec() koennen nur
  Kommandos ausgefuehrt werden, die im safe_mode_exec_dir
  stehen. Auf die ausgefuehrten Kommandos wird von den
  Funktionen system() und exec() automatisch EscapeShellCmd()
  angewendet (nicht so von popen() -> Luecke! -> Patch!).

[ dieser hier angesprochene patch ist in der version 3.0.14 verarbeitet
worden, daher haenge ich diesen nicht hier an ]

- Dynamisch ladbare Erweiterungen (dl()-Funktion) stehen in
  safe_mode nicht zur Verfuegung ("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 Eigentuemer des Scriptes als Bestandteil des Reals
  hinzufuegen.

- Das filepro Map-File "<dir>/map" (wobei <dir> der Parameter
  der filepro()-Funktionen ist) muss dem Eigentuemer... 

  Dies gilt fuer filepro(), filepro_rowcount() und
  filepro_retrieve().

- Das dbase-Modul verlangt in dbase_open(), dass die dbf-Datei
  dem Eigentuemer...

  dbase_create() setzt voraus, dass das Verzeichnis, in dem
  die Datei angelegt wird, dem Eigentuemer...

- Das DBM-Modul setzt voraus, dass in dbmopen() das Verzeichnis,
  in dem die DBM-Datenbank angelegt wird, dem Eigentuemer...

  Dies ist auf den ersten Blick nicht der Fall, wenn stattdessen
  DBA verwendet wird. Jemand sollte das pruefen...

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

>und was macht die cgi-version _noch_ sicherer? 

Man kann die CGI-Version in einem chroot()-Environment
verwenden und mit setrlimit() noch weitergehende
Einschraenkungen definieren. Dies ist vergleichsweise sicher
gegen Fehler wie den o.a. popen()-Bug.

--- beisskante ---

ich hoffe, damit kommst du weiter.

gruss, markus


php::bar PHP Wiki   -   Listenarchive