Safe mode

Manuel PHP
Précédent |  | Suivant

# 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

Fonction | Limitations
--- | ---
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 operator | Cette 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. | ??

Précédent | Sommaire | Suivant
Connexions persistantes aux bases de données | Niveau supérieur | Using PHP from the command line