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 intervenants,
notamment les fournisseurs d'hébergement, utilisent
le "Safe Mode".
Pour plus de détails sur les constantes PHP_INI_*,
reportez-vous à Annexe G.
Voici un éclaircissement sur
l'utilisation des directives de configuration.
safe_mode
booléen
Active ou non le mode de sécurité de PHP.
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, sinon, sur les GID.
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.
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.
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.
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.
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.
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/.
Note :
Le support des dossiers multiples a été ajouté en PHP 3.0.7.
La valeur par défaut permet l'ouverture de
tous les fichiers.
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.
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.
Disponibilité :
Cette directive est disponible depuis PHP 4.3.2
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 :
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
du fichier soit trop restrictive, et qu'une vérification sur le nom
du groupe 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 vous 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 (Apache httpd.conf) :