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 Plusdisplay_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.
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
ylog_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