Seguridad y modo seguro
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.
AdvertenciaEsta 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.