El Modo Seguro de PHP es un intento para resolver el problema de la seguridad en un servidor compartido. Tratar de resolver este problema al nivel de PHP es arquitectónicamente incorrecto, pero ya que las alternativas en un servidor web y a niveles de sistemas operativos no son tan realistas, mucha gente, especialmente la de proveedores de Internet (ISP), usa el Modo Seguro por ahora.
Tabla 22-1. Las directivas de Configuración que controlan el Modo Seguro son:
Directiva | Valor por Omisión |
---|---|
safe_mode | Off |
safe_mode_gid | 0 |
safe_mode_include_dir | "" |
safe_mode_exec_dir | 1 |
open_basedir | "" |
safe_mode_allowed_env_vars | PHP_ |
safe_mode_protected_env_vars | LD_LIBRARY_PATH |
disable_functions | "" |
Cuando safe_mode está en On, el PHP verifica si el dueño del script actual coincide con el dueño del fichero a ser operado por una función de fichero. 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 |
<?php readfile('/etc/passwd'); ?> |
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, pueden haber ambientes donde una estricta verificación del UID no es apropiada, y una relajada verificación del GID es suficiente. Esto es soportado por medio del switch safe_mode_gid. Seteándolo a On hace la verificación relajada GID, seteándolo a Off (el valor por omisión) hace la verificación del UID.
Si en vez del safe_mode, Ud. setea un directorio open_basedir, entonces todas las operaciones de fichero estarán limitadas a los ficheros bajo ese directorio especificado. Por ejemplo (ejemplo de httpd.conf de Apache):
<Directory /docroot> php_admin_value open_basedir /docroot </Directory> |
Warning: open_basedir restriction in effect. File is in wrong directory in /docroot/script.php on line 2 |
Ud. también puede inhabilitar funciones individuales. Note que la directiva disable_functions no puede ser usada fuera del fichero php.ini lo que significa que Ud. no puede inhabilitar funciones en los principios per-virtualhost o per-directory en su fichero httpd.conf. Si agregamos esto a nuestro fichero php.ini:
disable_functions readfile,system |
Warning: readfile() has been disabled for security reasons in /docroot/script.php on line 2 |
Esta es una lista probablemente incompleta y posiblemente incorrecta de las funciones limitadas por safe mode.
Tabla 22-2. Funciones limitadas por Modo Seguro
Función | Limitaciones |
---|---|
dbmopen() |
|
dbase_open() |
|
filepro() |
|
filepro_rowcount() |
|
filepro_retrieve() |
|
ifx_*() | restricciones sql_safe_mode, (!= safe mode) |
ingres_*() | restricciones sql_safe_mode, (!= safe mode) |
mysql_*() | restricciones sql_safe_mode, (!= safe mode) |
pg_loimport() |
|
posix_mkfifo() |
|
putenv() | Obecede las ini-directivas safe_mode_protected_env_vars y safe_mode_allowed_env_vars. Vea también la documentación de putenv() |
move_uploaded_file() |
|
chdir() |
|
dl() | Esta función no está activada en safe-mode (modo-seguro) |
backtick operator | Esta función no está activada en safe-mode (modo-seguro) |
shell_exec() (equivalencia funcional de backticks) | Esta función no está activada en safe-mode (modo-seguro) |
exec() | Ud. puede correr sólo ejecutables dentro delsafe_mode_exec_dir. Por razones prácticas, no está actualmente permitido tener componentes .. en la ruta del fichero ejecutable. |
system() | Ud. puede correr sólo ejecutatables dentro delsafe_mode_exec_dir. Por razones prácticas, no está actualmente permitido tener componentes .. en la ruta del fichero ejecutable. |
passthru() | Ud. puede correr sólo ejecutatables dentro delsafe_mode_exec_dir. Por razones prácticas, no está actualmente permitido tener componentes .. en la ruta del fichero ejecutable. |
popen() | Ud. puede correr sólo ejecutatables dentro delsafe_mode_exec_dir. Por razones prácticas, no está actualmente permitido tener componentes .. en la ruta del fichero ejecutable. |
mkdir() |
|
rmdir() |
|
rename() |
|
unlink() |
|
copy() |
|
chgrp() |
|
chown() |
|
chmod() |
|
touch() |
|
symlink() |
|
link() |
|
getallheaders() | En Modo Seguro, las cabeceras que empiezan con 'authorization' (insensitivo al tipo de letra) no serán retornadas. Advertencia: esto está roto por la implementación de aol-server de getallheaders()! |
header() | En Modo Seguro, el UID del script está agregado a la parte realm de la cabecera WWW-Authenticate si Ud. setea esta cabecera (usado por HTTP Authentication). |
highlight_file(), show_source() |
|
parse_ini_file() |
|
Cualquier función que usa php4/main/fopen_wrappers.c | ?? |