Configuraciones de PHP para seguridad

Avanzado
PHP
PHP
Actualizado: 17/02/2025

¡Desbloquea el curso de PHP completo!

IA
Ejercicios
Certificado
Entrar

Mira la lección en vídeo

Accede al vídeo completo de esta lección y a más contenido exclusivo con el Plan Plus.

Desbloquear Plan Plus

display_errors vs. log_errors en producción

En entornos de desarrollo, es común que los errores se muestren directamente en pantalla para facilitar la depuración. Esto se logra mediante la directiva display_errors en el archivo php.ini. Sin embargo, en producción, mostrar errores al usuario final puede exponer información sensible y comprometer la seguridad de la aplicación.

La directiva display_errors controla si los errores de PHP se muestran o no en la salida estándar. Para evitar revelar detalles internos de la aplicación, es fundamental establecer display_errors en Off en entornos de producción:

display_errors = Off

En lugar de mostrar errores, es recomendable registrarlos para que los desarrolladores puedan revisarlos posteriormente. La directiva log_errors permite habilitar el registro de errores en un archivo especificado por error_log:

log_errors = On
error_log = /var/log/php_errors.log

Es importante asegurarse de que el archivo de registro tenga los permisos adecuados y esté ubicado en un directorio seguro. De esta manera, se mantiene un historial de errores sin comprometer la integridad del sistema ni exponer información al público.

Controlar el nivel de notificaciones que se registran es esencial. La directiva error_reporting permite establecer el nivel de errores que se desean reportar. En un entorno de producción, es común registrar solo errores críticos:

error_reporting = E_ERROR | E_WARNING | E_PARSE

Estas configuraciones también pueden ajustarse en tiempo de ejecución utilizando funciones como ini_set() y error_reporting() dentro de los scripts PHP. Por ejemplo:

<?php
ini_set('display_errors', 'Off');
ini_set('log_errors', 'On');
ini_set('error_log', '/var/log/php_errors.log');
error_reporting(E_ERROR | E_WARNING | E_PARSE);

// Resto del código de la aplicación

Al utilizar el servidor web integrado de PHP con php -S localhost:8000, es fundamental aplicar estas configuraciones para garantizar que los usuarios no vean mensajes de error sensibles. Así se protege la aplicación de posibles vulnerabilidades que puedan ser explotadas si se revela información técnica.

Mantener una correcta gestión de errores en producción mejora la seguridad y facilita el mantenimiento de la aplicación. Los desarrolladores pueden acceder a los registros de errores para solucionar problemas sin comprometer la experiencia del usuario final.

disable_functions para limitar funciones potencialmente peligrosas

Guarda tu progreso

Inicia sesión para no perder tu progreso y accede a miles de tutoriales, ejercicios prácticos y nuestro asistente de IA.

Progreso guardado
Asistente IA
Ejercicios
Iniciar sesión gratis

Más de 25.000 desarrolladores ya confían en CertiDevs

La directiva disable_functions en el archivo php.ini permite deshabilitar funciones de PHP que pueden ser potencialmente peligrosas si son explotadas por actores maliciosos. Al limitar el acceso a ciertas funciones, se incrementa significativamente la seguridad de la aplicación al prevenir posibles vulnerabilidades.

Funciones como exec, shell_exec, system, passthru, popen y proc_open permiten ejecutar comandos del sistema operativo desde PHP. Si un atacante logra aprovechar una vulnerabilidad para invocar estas funciones, podría ejecutar comandos arbitrarios, comprometiendo el servidor. Para mitigar este riesgo, se recomienda deshabilitar estas funciones si no son indispensables para el funcionamiento de la aplicación.

Para deshabilitar funciones, se debe editar el archivo php.ini y configurar la directiva disable_functions indicando las funciones a deshabilitar, separadas por comas:

disable_functions = exec,shell_exec,system,passthru,popen,proc_open

Después de realizar cambios en php.ini, es necesario reiniciar el servidor web para que las modificaciones surtan efecto. Si se utiliza el servidor web integrado de PHP con php -S localhost:8000, basta con detener y reiniciar el servidor.

Además de las funciones relacionadas con la ejecución de comandos, existen otras funciones que pueden representar un riesgo para la seguridad si son mal utilizadas. Por ejemplo, eval permite la ejecución de código PHP proporcionado en tiempo de ejecución, lo cual puede ser explotado para ejecutar código malicioso. También es recomendable deshabilitar funciones como phpinfo, que puede revelar información sensible sobre la configuración del servidor.

Una configuración más completa de disable_functions podría ser:

disable_functions = exec,shell_exec,system,passthru,popen,proc_open,eval,phpinfo,show_source

Es importante tener en cuenta que disable_functions no puede ser modificada en tiempo de ejecución mediante ini_set(). Esto garantiza que el bloqueo de funciones no pueda ser alterado por el propio código de la aplicación, aumentando la protección contra intentos de evasión de seguridad.

Para verificar en tiempo de ejecución qué funciones están deshabilitadas, se puede utilizar ini_get():

<?php
$funciones_deshabilitadas = ini_get('disable_functions');
echo "Funciones deshabilitadas: $funciones_deshabilitadas\n";

Sin embargo, si ini_get también está deshabilitada, este método no estará disponible. Por ello, es esencial planificar cuidadosamente qué funciones se deshabilitan para no afectar la funcionalidad legítima de la aplicación.

En entornos donde no se tiene acceso directo al archivo php.ini, como en algunos hosting compartidos, es posible que no se pueda utilizar disable_functions. En estos casos, se deben explorar alternativas, como configurar las directivas en archivos .user.ini o a través de la interfaz de gestión del hosting, siempre y cuando sea posible y esté permitido.

Deshabilitar funciones potencialmente peligrosas es una medida preventiva que ayuda a reducir la superficie de ataque y proteger la integridad del sistema. Es una práctica recomendada en el despliegue de aplicaciones PHP en entornos de producción, contribuyendo a crear un entorno más seguro y confiable.

Uso de .htaccess y control de acceso a archivos

El archivo .htaccess es un archivo de configuración utilizado por el servidor web Apache para controlar diversos aspectos del comportamiento del servidor, incluyendo la seguridad y el acceso a los archivos. Mediante este archivo, es posible establecer reglas que protegen directorios, restringen el acceso a ciertos recursos y configuran directivas que fortalecen la seguridad de una aplicación PHP.

Una de las utilidades principales de .htaccess es restringir el acceso a directorios sensibles. Por ejemplo, se puede denegar el acceso a cualquier solicitud a un directorio específico añadiendo las siguientes líneas al archivo .htaccess ubicado en dicho directorio:

Order Allow,Deny
Deny from all

Esta configuración evita que los usuarios accedan directamente al contenido del directorio, protegiendo archivos que no deben ser expuestos públicamente, como archivos de configuración o scripts internos.

Otra directiva importante es la protección de archivos con extensiones específicas. Si se desea bloquear el acceso a archivos con extensiones sensibles, como .ini o .env, se puede usar:

<FilesMatch "\.(ini|env)$">
    Order Allow,Deny
    Deny from all
</FilesMatch>

De esta forma, se impide que los usuarios puedan descargar o visualizar archivos que podrían contener información confidencial.

Además, se puede utilizar el archivo .htaccess para evitar la ejecución de scripts en determinados directorios, aumentando la seguridad ante posibles inyecciones de código. Por ejemplo, para desactivar la ejecución de scripts PHP en un directorio específico:

php_flag engine off

Esto es útil en directorios donde se permiten cargas de archivos por parte de los usuarios, evitando que puedan subir y ejecutar scripts maliciosos.

Es importante también agregar cabeceras de seguridad que refuercen la protección de la aplicación. Mediante .htaccess, se pueden establecer cabeceras como X-Content-Type-Options, X-Frame-Options y X-XSS-Protection:

Header set X-Content-Type-Options "nosniff"
Header set X-Frame-Options "DENY"
Header set X-XSS-Protection "1; mode=block"

Estas cabeceras ayudan a mitigar ataques comunes como Cross-Site Scripting (XSS) y Clickjacking, proporcionando una capa adicional de defensa.

Aunque el archivo .htaccess es una herramienta potente para mejorar la seguridad, es esencial manejarlo con cuidado. Una mala configuración puede causar problemas de rendimiento o dejar vulnerabilidades abiertas. Se recomienda limitar el uso de .htaccess a las reglas necesarias y mantener un control de versiones para poder revertir cambios si es necesario.

Es importante destacar que el servidor web integrado de PHP iniciado con php -S localhost:8000 no soporta archivos .htaccess, ya que estas configuraciones son propias del servidor Apache. Sin embargo, para fines de desarrollo, es posible simular algunas de las restricciones a nivel de aplicación utilizando código PHP. Por ejemplo, se puede denegar el acceso a un directorio específico añadiendo un archivo index.php en dicho directorio con el siguiente contenido:

<?php
header('HTTP/1.0 403 Forbidden');
echo "Acceso denegado\n";

Este script devuelve un código de estado HTTP 403 Forbidden, impidiendo el acceso al directorio. De esta manera, se puede mantener cierto nivel de control durante el desarrollo con el servidor integrado.

Para controlar el acceso a archivos específicos, se puede utilizar una lógica en los puntos de entrada de la aplicación que verifique los permisos y restricciones. Por ejemplo:

<?php
$archivo = $_GET['archivo'] ?? '';

if (in_array($archivo, ['config.php', 'datos.env'])) {
    header('HTTP/1.0 403 Forbidden');
    echo "Acceso denegado\n";
    exit();
}

// Resto del código para manejar la solicitud

Con esta comprobación, se previene que los usuarios accedan a archivos sensibles mediante solicitudes manipuladas.

En entornos de producción donde se utiliza Apache, es preferible configurar las protecciones necesarias mediante .htaccess o, idealmente, en las configuraciones del servidor (httpd.conf), logrando una seguridad más robusta y a nivel del servidor.

Finalmente, es fundamental recordar que el control de acceso a archivos y directorios es una parte esencial de la seguridad en aplicaciones web. Combinando configuraciones del servidor con buenas prácticas en el código PHP, se crea una aplicación más segura y resistente a posibles ataques.

Aprendizajes de esta lección de PHP

  • Comprender la diferencia entre display_errors y log_errors en entornos de producción.
  • Saber cómo configurar el php.ini para la seguridad de la aplicación PHP.
  • Implementar el uso del archivo .htaccess para reforzar la seguridad de la aplicación.
  • Deshabilitar funciones potencialmente peligrosas utilizando disable_functions.`
  • Aplicar configuraciones de errores críticos en ambientes de producción con error_reporting.
  • Implementar estrategias de seguridad adicionales con cabeceras HTTP en .htaccess.

Completa este curso de PHP y certifícate

Únete a nuestra plataforma de cursos de programación y accede a miles de tutoriales, ejercicios prácticos, proyectos reales y nuestro asistente de IA personalizado para acelerar tu aprendizaje.

Asistente IA

Resuelve dudas al instante

Ejercicios

Practica con proyectos reales

Certificados

Valida tus conocimientos

Más de 25.000 desarrolladores ya se han certificado con CertiDevs

⭐⭐⭐⭐⭐
4.9/5 valoración