Sécurité et "Safe Mode"
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.
Avertissement
Cette fonctionnalité est OBSOLÈTE à partir de PHP 5.3.0 et a été
SUPPRIMÉE à partir de PHP 5.4.0.
-
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.
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.
-
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.
Voir aussi
open_basedir,
disable_functions,
disable_classes,
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.