Seguridad y modo seguro

Directivas de configuración de seguridad y modo seguro
Nombre Por defecto Cambiable Historial de cambios
safe_mode "0" PHP_INI_SYSTEM Eliminada en PHP 5.4.0.
safe_mode_gid "0" PHP_INI_SYSTEM Eliminada en PHP 5.4.0.
safe_mode_include_dir NULL PHP_INI_SYSTEM Eliminada en PHP 5.4.0.
safe_mode_exec_dir "" PHP_INI_SYSTEM Eliminada en PHP 5.4.0.
safe_mode_allowed_env_vars "PHP_" PHP_INI_SYSTEM Eliminada en PHP 5.4.0.
safe_mode_protected_env_vars "LD_LIBRARY_PATH" PHP_INI_SYSTEM Eliminada en PHP 5.4.0.
Para más detalles y definiciones de los modos de PHP_INI_*, vea Dónde se puede realizar un ajuste de configuración.

He aquí una breve explicación de las directivas de configuración.

safe_mode boolean

Indica si habilitar el modo seguro de PHP. Si PHP se compila con --enable-safe-mode, el valor predeterminado será On; si no, será Off.

Advertencia

Esta característica ha sido declarada OBSOLETA desde PHP 5.3.0 y ELIMINADA a partir de PHP 5.4.0.

safe_mode_gid boolean

Por defecto, el modo seguro comprueba la comparación de un UID al abrir ficheros. Si se quiere suavizar esta comparación a un GID, se ha de activar safe_mode_gid. Indica si usar la comprobación de UID (FALSE) o de GID (TRUE) al acceder a un fichero.

safe_mode_include_dir string

Se omiten las comprobaciones de UID/GID cuando se incluyen ficheros de este directorio y sus subdirectorios (el directorio debe estar también en include_path o debe incluir la ruta completa).

Esta directiva puede tomar una ruta separada por dos puntos (punto y coma en Windows) de forma similar a la directiva include_path, en lugar de solamente un único directorio. Realmente, la restricción especificada es un prefijo, no un nombre de directorio. Esto significa que "safe_mode_include_dir = /dir/incl" también permite el acceso a "/dir/include" y "/dir/incls" si existen. Cuando solamente se quiera restringir el acceso al directorio especificado, se ha de finalizarlo con una barra. Por ejemplo: "safe_mode_include_dir = /dir/incl/". Si el valor de esta directiva está vacío, no se podrán incluir ficheros con UID/GID diferentes.
safe_mode_exec_dir string

Si PHP se emplea en modo seguro, system() y las demás funciones que ejecuten programas del sistema rechazarán iniciar programas que no estén en este directorio. Se ha de emplear / como separador de directorios en todos los entornos, incluyendo Windows.

safe_mode_allowed_env_vars string

Establecer ciertas variables de entorno podría crear una brecha potencial de seguridad. Esta directiva contiene una lista de prefijos separados por comas. En el modo seguro, el usuario podrá solamente modificar las variables de entorno cuyos nombre comiencen con los prefijos proporcionados aquí. Por omisión, los usuarios solamente podrán establecer variables de entorno que comiencen con PHP_ (p.ej., PHP_FOO=BAR).

Nota:

Si esta directiva está vacía, PHP permitirá al usuario modificar CUALQUIER variable de entorno.

safe_mode_protected_env_vars string

Esta directiva contiene una lista de variables de entorno separadas por comas que no podrá cambiar el un usuario que utilice putenv(). Estas variables estarán protegidas incluso si safe_mode_allowed_env_vars está establecida para permitir cambiarlas.

Véase también: open_basedir, disable_functions, disable_classes, register_globals, display_errors, y log_errors.

Cuando safe_mode está activado, PHP comprueba si el propietario del script en uso coincide con el del fichero sobre el que se va a operar mediante una función de ficheros o su directorio. Por ejemplo:

-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
La ejecución de script.php:
<?php
 readfile
('/etc/passwd'); 
?>
resultará en este error cuando el modo seguro está habilitado:
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

Sin embargo, podrían haber entornos donde una comprobación estricta del UID no sea apropiada, siendo una comprobación del GID suficiente. El soporte para esto se realiza a través de safe_mode_gid. Al establecerlo a On se realiza la comprobación del GID, y al establecerlo a Off (lo predeterminado) se realiza la del UID.

Si en lugar de safe_mode se establece un directorio de open_basedir, todas las operaciones de ficheros estarán limitadas a ficheros que estén bajo el directorio especificado. Por ejemplo (ejemplo de httpd.conf de Apache):

<Directory /docroot>
  php_admin_value open_basedir /docroot 
</Directory>
Si se ejecuta el mismo script.php con esta configuración de open_basedir, el resultado será este:
Warning: open_basedir restriction in effect. File is in wrong directory in 
/docroot/script.php on line 2 

También se pueden deshabilitar funciones individuales. Observe que la directiva disable_functions no se puede utilizar fuera del fichero php.ini, lo que significa que no se pueden deshabilitar funciones basándose en un host virtual o directorio en el fichero httpd.conf. Si se añade lo siguiente al fichero php.ini:

disable_functions = readfile,system
se obtendrá esta salida:
Warning: readfile() has been disabled for security reasons in 
/docroot/script.php on line 2 

Advertencia

Por supuesto, estas restricciones de PHP no son válidas para binarios en ejecución.