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:

  1. exec(): Ejecuta un comando externo y devuelve la última línea de la salida. Puede ser explotado para ejecutar comandos del sistema.
  2. 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.
  3. shell_exec(): Ejecuta un comando a través del shell y retorna la salida completa. Permite la ejecución de comandos del sistema.
  4. system(): Ejecuta un comando externo y muestra la salida. Es similar a exec() pero devuelve la salida completa.
  5. proc_open(): Ejecuta un comando y abre un descriptor de proceso, proporcionando un control más fino sobre la ejecución de comandos.
  6. popen(): Abre un descriptor de proceso para lectura o escritura, lo que permite la ejecución de comandos del sistema.
  7. 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.
  8. eval(): Evalúa un string como código PHP. Es extremadamente peligroso porque puede ejecutar cualquier código PHP.
  9. 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.
  10. dl(): Carga una extensión PHP en tiempo de ejecución. Puede ser utilizado para cargar extensiones maliciosas.
  11. phpinfo(): Muestra información detallada sobre la configuración de PHP. Puede ser utilizado para obtener información sensible del servidor.
  12. putenv(): Modifica las variables de entorno del proceso PHP. Puede cambiar el comportamiento del servidor.
  13. getenv(): Recupera el valor de una variable de entorno. Puede ser utilizado para obtener información sensible del entorno del servidor.
  14. ini_set(): Cambia la configuración de PHP en tiempo de ejecución. Puede ser utilizado para desactivar ciertas protecciones.
  15. ini_restore(): Restaura el valor de una directiva de configuración de PHP. Similar a ini_set(), pero más restrictivo.
  16. openlog(), syslog(), closelog(): Manejan logs del sistema, lo que puede ser explotado para obtener información del sistema.
  17. 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.
  18. proc_terminate(): Termina un proceso, lo que puede ser utilizado para interrumpir servicios críticos.
  19. 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

  1. 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
  2. Añadir o modificar la directiva disable_functions con la lista de funciones que quieres deshabilitar.
  3. Guardar los cambios y cerrar el editor. En nano, presiona CTRL + O para guardar y CTRL + X para salir.
  4. 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

  1. 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.
  2. 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.
  3. Cumplimiento Normativo: Algunas normativas de seguridad y políticas corporativas requieren deshabilitar ciertas funciones para cumplir con los estándares de seguridad.

Limitaciones

  1. Interferencia con Funcionalidades: Algunas aplicaciones pueden depender de funciones específicas. Deshabilitarlas podría romper la funcionalidad de estas aplicaciones.
  2. 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.
  3. 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.