PHP 5.4.33 Released

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 realiza una comprobación con la comparación de UID al abrir ficheros. Si se quiere suavizar la comparación a un GID, se ha de activar safe_mode_gid. Indica si usar la comprobación de UID (FALSE) o 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 desee 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 ser 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án ser cambiadas por el usuario empleando putenv(). Estas variables estarán protegidas incluso si safe_mode_allowed_env_vars está establecida para permitir cambiarlas.

Ver 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 por 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
Ejecutar 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 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 este ajuste 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. Observar que la directiva disable_functions no se puede utilizar fuera del fichero php.ini, lo que significa que no se pueden deshabilitar funciones en base a 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.

add a note add a note

User Contributed Notes 1 note

up
0
rayro at gmx dot de
5 years ago
Theres a failure with open_basedir and per-host configuration
in apache as described in bug #42836: http://bugs.php.net/bug.php?id=42836

I got the same errors on my development windows system and apache 2.2.4 with php 5.3.beta1.

This error (or similar) is shown:
Warning: Unknown: open_basedir restriction in effect. File(...)
is not within the allowed path(s): (� �� �@5�,�)

Fix:
  - try slashes at the end of the folder name
  or
  - put "php_admin_value open_basedir ..." at first of all in the configuration
To Top