Protección de Seguridad en PHP mediante la Desactivación de Funciones Peligrosas en php.ini
Introducción
PHP es uno de los lenguajes de programación más utilizados en el desarrollo web. Su popularidad se debe a su facilidad de uso, flexibilidad y capacidad para integrarse con una amplia variedad de bases de datos y servidores web. Sin embargo, como cualquier tecnología, PHP no está exento de riesgos de seguridad. Una de las mejores prácticas para mitigar estos riesgos en un entorno de producción es deshabilitar ciertas funciones peligrosas a través de la configuración del archivo php.ini
. Este artículo explora en profundidad cómo y por qué debes deshabilitar estas funciones para fortalecer la seguridad de tu aplicación PHP.
¿Qué es el archivo php.ini
?
El archivo php.ini
es el archivo de configuración principal de PHP. Este archivo controla varios aspectos del comportamiento de PHP, incluyendo la habilitación y deshabilitación de extensiones, la configuración de límites de recursos, y la personalización de variables globales. Los cambios realizados en este archivo afectan a todas las aplicaciones PHP que se ejecutan en el servidor.
Ubicación del archivo php.ini
La ubicación del archivo php.ini
puede variar según la instalación y el sistema operativo. En un sistema basado en Ubuntu, como Ubuntu 18.04, las ubicaciones comunes son:
- Para PHP en la línea de comandos (CLI):
/etc/php/7.2/cli/php.ini
- Para PHP en Apache:
/etc/php/7.2/apache2/php.ini
- Para PHP en PHP-FPM:
/etc/php/7.2/fpm/php.ini
Puedes verificar la ubicación del archivo php.ini
ejecutando el siguiente comando en la línea de comandos:
php --ini
Este comando te mostrará las rutas de todos los archivos de configuración de PHP cargados.
¿Por qué deshabilitar funciones en PHP?
Deshabilitar funciones peligrosas en PHP es una medida preventiva crucial para proteger tu aplicación de posibles ataques. Las funciones peligrosas son aquellas que, si se utilizan incorrectamente, pueden comprometer la seguridad del servidor y la integridad de los datos. Algunas de estas funciones permiten ejecutar comandos del sistema, manipular procesos, y acceder a información sensible del servidor. Al deshabilitar estas funciones, reduces significativamente la superficie de ataque y limitas las capacidades de un atacante en caso de que logre inyectar código malicioso.
Funciones Peligrosas que Debes Deshabilitar
Aquí tienes una lista de funciones que se recomienda deshabilitar en un entorno de producción, junto con una breve explicación de por qué son peligrosas:
- exec(): Ejecuta un comando externo y devuelve la última línea de la salida. Puede ser explotado para ejecutar comandos del sistema.
- passthru(): Ejecuta un comando del sistema y muestra la salida sin buffering. Similar a
exec()
, pero potencialmente más peligroso porque muestra toda la salida. - shell_exec(): Ejecuta un comando a través del shell y retorna la salida completa. Permite la ejecución de comandos del sistema.
- system(): Ejecuta un comando externo y muestra la salida. Es similar a
exec()
pero devuelve la salida completa. - proc_open(): Ejecuta un comando y abre un descriptor de proceso, proporcionando un control más fino sobre la ejecución de comandos.
- popen(): Abre un descriptor de proceso para lectura o escritura, lo que permite la ejecución de comandos del sistema.
- show_source(): Muestra el código fuente de un archivo. Puede revelar información sensible sobre la estructura y lógica de la aplicación.
- eval(): Evalúa un string como código PHP. Es extremadamente peligroso porque puede ejecutar cualquier código PHP.
- assert(): Similar a
eval()
, evalúa un string como código PHP si el string no es verdadero. Puede ser explotado para ejecutar código arbitrario. - dl(): Carga una extensión PHP en tiempo de ejecución. Puede ser utilizado para cargar extensiones maliciosas.
- phpinfo(): Muestra información detallada sobre la configuración de PHP. Puede ser utilizado para obtener información sensible del servidor.
- putenv(): Modifica las variables de entorno del proceso PHP. Puede cambiar el comportamiento del servidor.
- getenv(): Recupera el valor de una variable de entorno. Puede ser utilizado para obtener información sensible del entorno del servidor.
- ini_set(): Cambia la configuración de PHP en tiempo de ejecución. Puede ser utilizado para desactivar ciertas protecciones.
- ini_restore(): Restaura el valor de una directiva de configuración de PHP. Similar a
ini_set()
, pero más restrictivo. - openlog(), syslog(), closelog(): Manejan logs del sistema, lo que puede ser explotado para obtener información del sistema.
- escapeshellarg(), escapeshellcmd(): Escapan argumentos y comandos del shell. Aunque están diseñadas para evitar inyecciones de comandos, pueden ser explotadas en combinación con otras vulnerabilidades.
- proc_terminate(): Termina un proceso, lo que puede ser utilizado para interrumpir servicios críticos.
- proc_close(): Cierra un descriptor de proceso, potencialmente interrumpiendo operaciones en curso.
Ejemplo de Configuración en php.ini
Para deshabilitar estas funciones, debes editar el archivo php.ini
y añadir o modificar la directiva disable_functions
:
disable_functions = pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,exec,passthru,shell_exec,system,proc_open,popen,show_source,eval,assert,dl,phpinfo,putenv,getenv,ini_set,ini_restore,openlog,syslog,closelog,escapeshellarg,escapeshellcmd,proc_terminate,proc_close
Pasos para Editar el archivo php.ini
- Abrir el archivo
php.ini
en un editor de texto: Para PHP en Apache:sudo nano /etc/php/7.2/apache2/php.ini
Para PHP en CLI:sudo nano /etc/php/7.2/cli/php.ini
Para PHP en PHP-FPM:sudo nano /etc/php/7.2/fpm/php.ini
- Añadir o modificar la directiva
disable_functions
con la lista de funciones que quieres deshabilitar. - Guardar los cambios y cerrar el editor. En
nano
, presionaCTRL + O
para guardar yCTRL + X
para salir. - Reiniciar el servidor PHP para que los cambios surtan efecto. Dependiendo de tu configuración, esto puede implicar reiniciar Apache o PHP-FPM. Por ejemplo: Para Apache:
sudo systemctl restart apache2
Para PHP-FPM:sudo systemctl restart php7.2-fpm
Verificación de Cambios
Es importante verificar que las funciones se han deshabilitado correctamente. Puedes crear un pequeño script PHP para comprobarlo:
<?php
$disabled_functions = explode(',', ini_get('disable_functions'));
print_r($disabled_functions);
?>
Guarda este script en un archivo, por ejemplo, check_disabled_functions.php
, y ejecútalo desde tu navegador o línea de comandos:
php check_disabled_functions.php
Esto mostrará una lista de las funciones deshabilitadas, permitiéndote verificar que tu configuración se ha aplicado correctamente.
Beneficios y Limitaciones
Beneficios
- Reducción de la Superficie de Ataque: Deshabilitar funciones peligrosas limita las capacidades de un atacante en caso de que logre inyectar código malicioso en tu aplicación.
- Mejora de la Seguridad: Al deshabilitar funciones que no son necesarias para el funcionamiento de tu aplicación, mejoras la seguridad general de tu entorno.
- Cumplimiento Normativo: Algunas normativas de seguridad y políticas corporativas requieren deshabilitar ciertas funciones para cumplir con los estándares de seguridad.
Limitaciones
- Interferencia con Funcionalidades: Algunas aplicaciones pueden depender de funciones específicas. Deshabilitarlas podría romper la funcionalidad de estas aplicaciones.
- Mantenimiento Adicional: Deshabilitar funciones requiere un mantenimiento adicional para asegurarte de que las aplicaciones que se ejecutan en tu servidor no dependan de las funciones deshabilitadas.
- Falsa Sensación de Seguridad: Deshabilitar funciones es una medida importante, pero no es una solución completa. Es solo una parte de una estrategia de seguridad más amplia que incluye la validación de entradas, la gestión de parches y la configuración segura del servidor.
Conclusión
Deshabilitar funciones peligrosas en PHP mediante la configuración del archivo php.ini
es una
práctica esencial para asegurar un entorno de producción. Aunque no es una solución completa, reduce significativamente la superficie de ataque y protege tu aplicación de posibles vulnerabilidades. Asegúrate de probar tu configuración y monitorear tu aplicación para asegurarte de que estas medidas no afecten negativamente la funcionalidad legítima. Junto con otras prácticas de seguridad, como la validación de entradas y la gestión de parches, deshabilitar funciones es un paso importante hacia un entorno PHP más seguro y robusto.
Entradas recientes
El Comando Init en Linux: Gestión de Procesos en el Proceso de Inicio del Sistema
En el mundo de la administración de sistemas Linux, uno de los elementos más críticos…
El Futuro de ChatGPT: ¿Cuán Cerca Está de Pensar Como Nosotros?
La inteligencia artificial (IA) ha evolucionado rápidamente en los últimos años, con desarrollos impresionantes como…
IPv6: Mejoras Respecto a IPv4 y Herramientas para su Gestión en Linux
El crecimiento exponencial de dispositivos conectados a internet ha planteado serios desafíos a las redes…
Cómo determinar si NTP está siendo utilizado para la sincronización del reloj: Guía para administradores de sistemas
La sincronización precisa del tiempo en los sistemas de red es crucial para la correcta…
La Revolución de IPv6: Descubre por qué Necesitamos un Nuevo Protocolo
Desde que se ratificó hace casi 20 años, el protocolo IPv6 ha traído una serie…
Guía Completa para Capturar y Analizar Tráfico IP con tcpdump: Domina la Herramienta Esencial para Administradores de Sistemas
Capturar tráfico IP es una tarea esencial para los administradores de sistemas, ya sea para…
Esta web usa cookies.