PHP  
downloads | documentation | faq | getting help | | php.net sites | links 
search for in the  
previousConnexions persistantes aux bases de donn�esUsing PHP from the command linenext
Last updated: Tue, 11 Jun 2002
view this page in Printer friendly version | English | Brazilian Portuguese | Czech | Dutch | Finnish | German | Hungarian | Italian | Japanese | Korean | Polish | Romanian | Russian | Spanish | Turkish

Chapitre 23. Safe mode

Le "Safe Mode" est le mode de s�curit� de PHP : une solution au probl�me de partage de PHP sur un serveur. Ce syst�me p�che au niveau de l'architecture car il n'est pas correct de tenter de r�soudre ce probl�me au niveau de PHP, mais les solutions alternatives bas�es sur le serveur web et l'OS ne sont pas r�alistes. De nombreux acteurs, notamment les fournisseurs d'h�bergement, utilise le "Safe Mode".

Les directives de configuration qui contr�lent le safe mode sont :

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 =

Lorsque safe_mode est actif, PHP v�rifie que le propri�taire du script courant est le m�me que le propri�taire des fichiers qui seront manipul�s par ce script. Par exemple, dans a la situation suivante :

-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

�x�cuter le script script.php

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

g�n�rera cette erreur, si le safe mode est activ� :

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

Si vou utilisez la directive open_basedir au lieu du safe_mode, alors les manipulations seront limit�es aux fichiers situ�s dans les dossiers sp�cifi�s. Par exemple :

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

Si vous ex�cutez le script script.php ci-dessus avec la configuration d'open_basedir le r�sultat sera l'affichage suivant :

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

Vous pouvez aussi d�sactiver individuellement les fonctions. Par exemple, en ajoutant cette ligne dans le fichier php.ini :

disable_functions readfile,system

toute utilisation des fonctions readfile() et system() g�n�rera l'affichage suivant :

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

Functions d�sactiv�es par le Safe Mode

Voici une liste non-exhaustive des fonctions d�sactiv�es par le Safe Mode.

Tableau 23-1. Fonctions d�sactiv�es par le Safe Mode

FonctionLimitations
dbmopen()

Note�: V�rifie que le fichier/dossier que vous allez utiliser a le m�me UID que le script qui est actuellement ex�cut�..

dbase_open()

Note�: V�rifie que le fichier/dossier que vous allez utiliser a le m�me UID que le script qui est actuellement ex�cut�..

filepro()

Note�: V�rifie que le fichier/dossier que vous allez utiliser a le m�me UID que le script qui est actuellement ex�cut�..

filepro_rowcount()

Note�: V�rifie que le fichier/dossier que vous allez utiliser a le m�me UID que le script qui est actuellement ex�cut�..

filepro_retrieve()

Note�: V�rifie que le fichier/dossier que vous allez utiliser a le m�me UID que le script qui est actuellement ex�cut�..

Fonctions ifx_restrictions sql_safe_mode, (!= Safe Mode)
Fonctions ingres_restrictions sql_safe_mode, (!= Safe Mode)
Fonctions mysql_restrictions sql_safe_mode, (!= Safe Mode)
pg_loimport()

Note�: V�rifie que le fichier/dossier que vous allez utiliser a le m�me UID que le script qui est actuellement ex�cut�..

posix_mkfifo()

Note�: V�rifie que le fichier/dossier que vous allez utiliser a le m�me UID que le script qui est actuellement ex�cut�..

putenv()Ob�is aux directives safe_mode_protected_env_vars et safe_mode_allowed_env_vars. Voir aussi la documentation de putenv()
move_uploaded_file()

Note�: V�rifie que le fichier/dossier que vous allez utiliser a le m�me UID que le script qui est actuellement ex�cut�..

chdir()

Note�: V�rifie que le fichier/dossier que vous allez utiliser a le m�me UID que le script qui est actuellement ex�cut�..

dl()Cette fonction est d�sactiv�e par le safe-mode
backtick operatorCette fonction est d�sactiv�e par le safe-mode
shell_exec() (�quivalent fonctionnels des guillemets oblique)Cette fonction est d�sactiv�e par le safe-mode
exec() Vous ne pouvez �x�cuter que les programmes qui sont dans le dossier safe_mode_exec_dir. Pour des raisons pratiques, il n'est pas possible d'utiliser des jokers comme .. dans le chemin de ce dossier.
system() Vous ne pouvez �x�cuter que les programmes qui sont dans le dossier safe_mode_exec_dir. Pour des raisons pratiques, il n'est pas possible d'utiliser des jokers comme .. dans le chemin de ce dossier.
passthru() Vous ne pouvez �x�cuter que les programmes qui sont dans le dossier safe_mode_exec_dir. Pour des raisons pratiques, il n'est pas possible d'utiliser des jokers comme .. dans le chemin de ce dossier.
popen() Vous ne pouvez �x�cuter que les programmes qui sont dans le dossier safe_mode_exec_dir. Pour des raisons pratiques, il n'est pas possible d'utiliser des jokers comme .. dans le chemin de ce dossier.
mkdir()

Note�: V�rifie que le fichier/dossier que vous allez utiliser a le m�me UID que le script qui est actuellement ex�cut�..

rmdir()

Note�: V�rifie que le fichier/dossier que vous allez utiliser a le m�me UID que le script qui est actuellement ex�cut�..

rename()

Note�: V�rifie que le fichier/dossier que vous allez utiliser a le m�me UID que le script qui est actuellement ex�cut�..

Note�: V�rifie que le fichier/dossier que vous allez utiliser a le m�me UID que le script qui est actuellement ex�cut�..

unlink()

Note�: V�rifie que le fichier/dossier que vous allez utiliser a le m�me UID que le script qui est actuellement ex�cut�..

Note�: V�rifie que le fichier/dossier que vous allez utiliser a le m�me UID que le script qui est actuellement ex�cut�..

copy()

Note�: V�rifie que le fichier/dossier que vous allez utiliser a le m�me UID que le script qui est actuellement ex�cut�..

Note�: V�rifie que le fichier/dossier que vous allez utiliser a le m�me UID que le script qui est actuellement ex�cut�..

(on source and target)
chgrp()

Note�: V�rifie que le fichier/dossier que vous allez utiliser a le m�me UID que le script qui est actuellement ex�cut�..

chown()

Note�: V�rifie que le fichier/dossier que vous allez utiliser a le m�me UID que le script qui est actuellement ex�cut�..

chmod()

Note�: V�rifie que le fichier/dossier que vous allez utiliser a le m�me UID que le script qui est actuellement ex�cut�..

De plus, vous ne pouvez pas modifier les SUID, SGID et sticky bit
touch()

Note�: V�rifie que le fichier/dossier que vous allez utiliser a le m�me UID que le script qui est actuellement ex�cut�..

Note�: V�rifie que le fichier/dossier que vous allez utiliser a le m�me UID que le script qui est actuellement ex�cut�..

symlink()

Note�: V�rifie que le fichier/dossier que vous allez utiliser a le m�me UID que le script qui est actuellement ex�cut�..

Note�: V�rifie que le fichier/dossier que vous allez utiliser a le m�me UID que le script qui est actuellement ex�cut�..

(note: only the target is checked)
link()

Note�: V�rifie que le fichier/dossier que vous allez utiliser a le m�me UID que le script qui est actuellement ex�cut�..

Note�: V�rifie que le fichier/dossier que vous allez utiliser a le m�me UID que le script qui est actuellement ex�cut�..

(note: seule le fichier de destination est v�rifi�.
getallheaders() En Safe Mode, les ent�tes commencants par 'authorization' (sensible � la casse) ne seront pas retourn�s. Attention : cette protection est mise en d�faut par la fonction getallheaders() sur les serveurs AOL!
Toutes les fonctions qui utilisent les wrappers de fichiers. ??

User Contributed Notes
Safe mode
add a note about notes
Marc Delisle
16-Jul-2001 09:49

include() and require() are also limited by safe mode.


08-Sep-2001 01:17

Many filesystem-related functions are not appropriately restricted when
Safe Mode is activated on an NT server it seems.  I would assume that this
is due to the filesystem not making use of UID.

In all of my scripts, no matter WHO owns the script (file Ownership-wise)
or WHO owns the directory/file in question; both UIDs display

(getmyuid() and fileowner()) as UID = 0

This has the rather nasty side effect of Safe Mode allowing multiple
filesystem operations because it believes the script owner and file/dir
owner are one and the same.

While this can be worked around by the judicious application of proper
filesystem privileges, it's still a "dud" that many of Safe
Mode's securities are simply not there with an NT implementation.

phobo#paradise.net.nz
03-Oct-2001 01:21

If you do virutal hosting, you can turn safe mode on and off for different
Apache Virutal Hosts using the php_admin_value directive. This also allows
you to have customised maximum execution times, disabled functions, etc.
By placeing a base_dir for each virutal host, this means PHP CANNOT access
files below this heirachy; strongly recoomended for cutsomer hosting.

Eg:

[VirtualHost 127.0.0.1:80]
   DocumentRoot /var/www/html/safephphost/
   ServerName safephp
   php_admin_value safe_mode 1
   php_admin_value open_basedir /var/www/html/safephphost/
   php_admin_value sendmail_from phobo#paradise.net.nz
[/VirtualHost]


24-Jan-2002 10:45

Just to note, I created patch which allows VirtualHost to set User under
which all (PHP too) runs. It is more secure than safe_mode. See
luxik.cdi.cz/~devik/apache/ if you are interested


28-Apr-2002 02:42

All the filesystem-related functions (unlink, fopen, unlink, etc) seems to
be restricted the same way in safe mode, at least on PHP 4.2. If the file
UID is different *but* the directory (where the file is located) UID is
the same, it will work.

So creating a directory in safe mode is usually a bad idea since the UID
will be different from the script (it will be the apache UID) so it won't
be possible to do anything with the files created on this directory.


01-Jun-2002 11:11

This is just a reply to phobo#paradise.net.nz about the virtual server. 
This no longer works on apache, if you do try you will get:
Syntax error on line 1118 of /usr/www/conf/httpd.conf:
php_admin_value not allowed here


13-Jun-2002 09:37

You can a vhost.conf file.

<Directory /vhosts/domain.com/httpdocs/> 
php_admin_value safe_mode 0
php_admin_value open_basedir "/"
</Directory>

19-Jun-2002 08:44
disable_functions must use "=" operator to assign value. Please
correct exemple.

add a note about notes
previousConnexions persistantes aux bases de donn�esUsing PHP from the command linenext
Last updated: Tue, 11 Jun 2002
show source | credits | stats | mirror sites:  
Copyright © 2001, 2002 The PHP Group
All rights reserved.
This mirror generously provided by:
Last updated: Sat Jul 6 20:06:19 2002 CEST