S�curit� et "Safe Mode"

Options de configuration
Nom Par d�faut Modifiable Historique
safe_mode "0" PHP_INI_SYSTEM Supprim� en PHP 6.0.0.
safe_mode_gid "0" PHP_INI_SYSTEM Disponible depuis PHP 4.1.0. Supprim� en PHP 6.0.0.
safe_mode_include_dir NULL PHP_INI_SYSTEM Disponible depuis PHP 4.1.0.Supprim� en PHP 6.0.0.
safe_mode_exec_dir "" PHP_INI_SYSTEM Supprim� en PHP 6.0.0.
safe_mode_allowed_env_vars "PHP_" PHP_INI_SYSTEM Supprim� en PHP 6.0.0.
safe_mode_protected_env_vars "LD_LIBRARY_PATH" PHP_INI_SYSTEM Supprim� en PHP 6.0.0.
open_basedir NULL PHP_INI_ALL PHP_INI_SYSTEM en PHP < 5.3.0.
disable_functions "" php.ini seulement Disponible depuis PHP 4.0.1.
disable_classes "" php.ini seulement Disponible depuis PHP 4.3.2.

Pour plus de d�tails sur les modes PHP_INI_*, reportez-vous � O� une directive de configuration peut �tre modifi�e.

Voici un �claircissement sur l'utilisation des directives de configuration.

safe_mode bool�en

Active ou non le mode de s�curit� de PHP. Si PHP est compil� avec --enable-safe-mode, la valeur par d�faut sera On, sinon Off.

safe_mode_gid bool�en

Par d�faut, le safe mode fait une comparaison des propri�taires, avant d'ouvrir un fichier. Si vous voulez all�ger un peu ce niveau de s�curit�, vous pouvez r�aliser une comparaison de groupe, et activer cette directive. Si cette directive vaut FALSE (sa valeur par d�faut), c'est une comparaison sur les UID, et, si elle vaut TRUE c'est une comparaison sur les GID.

safe_mode_include_dir cha�ne de caract�res

Les v�rifications bas�es sur le UID ou GID sont ignor�es lorsque les fichiers inclus sont plac�s dans le dossier indiqu� par cette directive, ainsi que ses sous-dossiers. Les dossiers peuvent �tre aussi dans l'include_path ou bien il faut inclure le chemin complet.

Depuis PHP 4.2.0, cette directive utilise le point virgule de la m�me fa�on que le fait include_path, pour permettre de configurer plusieurs dossiers. La restriction sp�cifi�e est en fait un pr�fixe, plus qu'un nom de dossier. Cela signifie que "safe_mode_include_dir = /dir/incl" autorise aussi bien "/dir/include" que "/dir/incls", s'ils existent. Lorsque vous souhaitez restreindre l'acc�s � un dossier sp�cifique, il faut terminer cette directive avec un slash. Par exemple "safe_mode_include_dir = /dir/incl/". Si la valeur de cette directive est vide, aucun fichier avec le UID/GID diff�rent ne peut �tre inclus dans PHP 4.2.3 et dans les versions PHP 4.3.3 et plus r�centes. Dans les versions ant�rieures, tous les fichiers pouvaient �tre inclus.
safe_mode_exec_dir cha�ne de caract�res

Si PHP est utilis� en safe mode, les fonctions comme system() et toutes celles qui permettent l'ex�cution en ligne de commande refuseront d'ex�cuter des programmes qui ne sont pas dans ce dossier. Vous devez utiliser / en tant que s�parateur de dossier sous tous les environnements, y compris Windows.

safe_mode_allowed_env_vars cha�ne de caract�res

Modifier certaines variables d'environnement est un trou de s�curit� potentiel. Cette directive contient une liste de noms de variables d'environnement s�par�es par des virgules, ou de pr�fixes. En Safe mode, l'utilisateur ne pourra modifier que les variables d'environnement dont le nom commence par l'un des pr�fixes fourni ici. Par d�faut, les utilisateurs ne peuvent modifier que les variables d'environnement qui commencent par PHP_ (e.g. PHP_FOO=BAR).

Note: Si cette directive est vide, PHP autorisera la modification de TOUTES les variables d'environnement.

safe_mode_protected_env_vars cha�ne de caract�res

Cette directive contient une liste de variables d'environnement que le programmeur ne pourra pas modifier en utilisant la fonction putenv(). Ces variables seront prot�g�es, m�me si la directive safe_mode_allowed_env_vars autorise leur modification.

open_basedir cha�ne de caract�res

Limite les fichiers accessibles par PHP dans l'arborescence. Cette directive n'est pas affect�e par le safe mode.

Lorsqu'un script tente d'ouvrir un fichier, avec les fonctions fopen() ou gzopen(), la situation du fichier est v�rifi�e. Si le fichier se situe hors du dossier sp�cifi� dans cette directive, PHP refusera de l'ouvrir. Les liens symboliques sont r�solus, ce qui fait que cette restriction ne peut �tre contourn�e par un lien symbolique. Si le fichier n'existe pas, le lien symbolique ne pourra pas �tre r�solu et le nom de fichier sera compar� � open_basedir.

La valeur sp�ciale . indique que le dossier dans lequel le script est stock� servira de dossier de base. Cela est cependant un peu dangereux car le dossier courant du script peut facilement �tre modifi� avec la fonction chdir().

Dans httpd.conf, open_basedir peut �tre d�sactiv�e (i.e. pour certains h�tes virtuels) de la m�me mani�re que toute autre directive de configuration avec la syntaxe "php_admin_value open_basedir none".

Sous Windows, s�parez les dossiers par des points virgules. Sur les autres syst�mes, s�parez les dossiers avec des deux-points. Lorsque PHP est utilis� comme module Apache, les chemins de la directive open_basedir des dossiers parents sont automatiques transmis.

La restriction sp�cifi�e par open_basedir est en fait un pr�fixe et non un dossier. Cela signifie que "open_basedir = /dir/incl" donne acc�s au dossier "/dir/include" et aussi au dossier "/dir/incls" s'il existe. Lorsque vous souhaitez restreindre l'acc�s � un dossier sp�cifique, ajoutez un slash final. Par exemple : open_basedir = /dir/incl/.

La valeur par d�faut permet l'ouverture de tous les fichiers.

Note: Depuis PHP 5.3.0, open_basedir peut �tre modifi� au moment de l'ex�cution. Cela signifie que si open_basedir est d�fini � /www/ dans votre fichier php.ini, un script peut le modifier en /www/tmp/ au moment de l'ex�cution via la fonction ini_set().

disable_functions cha�ne de caract�res
Cette directive vous permet de d�sactiver certaines fonctions pour des raisons de s�curit�. Elle prend une liste de nom de fonctions, s�par�s par des virgules. disable_functions n'est pas affect�e par le Safe Mode. Cette directive doit �tre configur�e dans le fichier php.ini. Par exemple, vous ne pourrez pas la configurer dans le fichier httpd.conf.
disable_classes cha�ne de caract�res
Cette directive vous permet de d�sactiver certaines classes pour des raisons de s�curit�. Elle prend une liste de nom de fonctions, s�par�es par des virgules. disable_functions n'est pas affect�e par le Safe Mode. Cette directive doit �tre configur�e dans le fichier php.ini. Par exemple, vous ne pourrez pas la configurer dans le fichier httpd.conf.

Note: Disponibilit�
Cette directive est disponible depuis PHP 4.3.2

Voir aussi register_globals, display_errors et log_errors.

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 ou dossiers qui seront manipul�s par ce script. Par exemple, dans 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

ex�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

Cependant, il arrive que la v�rification faite avec le nom du propri�taire (UID) du fichier soit trop restrictive, et qu'une v�rification sur le nom du groupe (GID) soit suffisante. C'est une autre fonctionnalit� support�e par la directive safe_mode_gid. En lui donnant la valeur de On, les v�rifications seront faites sur le GID, alors qu'en lui laissant sa valeur par d�faut de Off, les v�rifications seront faites sur le UID.

Si au lieu d'utiliser le Safe Mode, vous utilisez la directive open_basedir, alors les manipulations seront limit�es aux fichiers situ�s dans les dossiers sp�cifi�s. Par exemple (Apache httpd.conf) :

<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 �galement d�sactiver les fonctions particuli�res. Notez que la directive disable_functions ne peut �tre utilis�e en dehors du fichier php.ini, ce qui signifie que vous ne pouvez pas d�sactiver des fonctions par virtualhost ou par dossiers, dans votre fichier httpd.conf. Si nous ajoutons ceci � notre 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

Avertissement

Ces restrictions de PHP sont bien s�r invalides en ex�cution binaire.