Ardilla Quio Ardilla Quio

04 de Julio de 2011

Directivas PHP: safe_mode

Dice la documentación oficial de PHP que la directiva safe_mode es un intento de resolver un problema de seguridad en servidores compartidos. Y aunque sí mejora la seguridad no resulta una práctica infalible, ya que lleva a muchos proveedores de Internet (ISP) y programadores a pensar que están a salvo de amenazas de seguridad. Esto no debe ser del todo cierto cuando la comunidad PHP la ha declarado obsoleta en la versión 5, y no estará presente en la versión 6.

¿Cómo aumenta safe_mode la seguridad?

Con la directiva safe_mode activada PHP comprueba que el usuario actual es el propietario (UID) de los ficheros y directorios a los que desea acceder cada script, esto es verdaderamente útil cuando trabajamos con servidores compartidos, puesto que si un script sube un archivo a un servidor compartido, generalmente es guardado con el usuario web por defecto ("apache", "httpd", ...), por lo que sin la comprobación de usuario cualquier aplicación del servidor compartido podría acceder a nuestro fichero.

Esta directiva también restringe el uso de ejecutables que puedan correr los scripts en nuestro sistema, lo que afecta a las funciones sytem(), exec() y shell_exec() entre otras.

Un ejemplo de los problemas que puede traer el safe_mode activado es en sistemas Linux, porque como dijimos al crear un directorio se crea con el usuario de Apache, por lo que un usuario del sistema no tendrá acceso al directorio, ni a los archivos dentro de éste.

Hay una serie de ajustes que nos ayudan a trabajar con safe_mode activado y superar sus limitaciones, éstos son:

safe_mode_gid

En algunos casos puede resultar útil que el modo seguro compruebe únicamente los permisos de grupo en el archivo (GID), en este caso deberemos activar la directiva.

safe_mode_include_dir

Definimos un directorio en el que sus archivos se consideran seguros para el equipo, por lo que no necesitaremos comprobar el UID para trabajar con ellos.

safe_mode_exec_dir

En este directorio estarán los programas que podrán ser ejecutados con safe_mode activado. Si este directorio no está establecido las llamadas a las funciones sytem() o exec() fallarán. La función shell_exec() no está disponible con safe_mode activado.

Hay que tener también en cuenta que, con safe_mode habilitado, la cadena de comandos que se le pasa a estas funciones se escapa automáticamente con escapeshellcmd().

safe_mode_allowed_env_vars

Define una lista de variables de entorno que el usuario podrá cambiar. Si no está establecido, todas las variables pueden ser editadas.

Existe otra directiva de PHP que nos permite asignar una seguridad de acceso a nuestros ficheros y directorios, open_basedir, que activada limita las operaciones que se pueden realizar en los directorios configurados, y no depende del estado de safe_mode.

1 comentarios

Anónimo

24/10/2013 08:30:13

Muchas gracias. Estaba dudando si activarlo o no. Finalmente lo activaré porque no quiero permitir que un php pueda cambiar el time limit

Comentario anónimo
Comentar como usuario