PHP

PHP

Tutorial PHP: Configuraciones de PHP para seguridad

Optimizando PHP para producción con `display_errors`, `log_errors` y .htaccess para mejorar seguridad y manejos de errores.

Aprende PHP GRATIS y certifícate

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

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.

Para seguir leyendo hazte Plus

¿Ya eres Plus? Accede a la app

20 % DE DESCUENTO

Plan mensual

19.00 /mes

15.20 € /mes

Precio normal mensual: 19 €
58 % DE DESCUENTO

Plan anual

10.00 /mes

8.00 € /mes

Ahorras 132 € al año
Precio normal anual: 120 €
Aprende PHP GRATIS online

Todas las lecciones de PHP

Accede a todas las lecciones de PHP y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Introducción A Php

PHP

Introducción Y Entorno

Instalación Y Primer Programa De Php

PHP

Introducción Y Entorno

Tipos De Datos, Variables Y Constantes

PHP

Sintaxis

Operadores Y Expresiones

PHP

Sintaxis

Estructuras De Control

PHP

Sintaxis

Funciones Y Llamada De Funciones

PHP

Sintaxis

Cadenas De Texto Y Manipulación

PHP

Sintaxis

Manejo De Números

PHP

Sintaxis

Manejo De Fechas Y Tiempo

PHP

Sintaxis

Manejo De Arrays

PHP

Sintaxis

Introducción A La Poo En Php

PHP

Programación Orientada A Objetos

Clases Y Objetos

PHP

Programación Orientada A Objetos

Constructores Y Destructores

PHP

Programación Orientada A Objetos

Herencia

PHP

Programación Orientada A Objetos

Encapsulación

PHP

Programación Orientada A Objetos

Polimorfismo

PHP

Programación Orientada A Objetos

Interfaces

PHP

Programación Orientada A Objetos

Traits

PHP

Programación Orientada A Objetos

Namespaces

PHP

Programación Orientada A Objetos

Autoloading De Clases

PHP

Programación Orientada A Objetos

Manejo De Errores Y Excepciones

PHP

Programación Orientada A Objetos

Manejo De Archivos

PHP

Programación Orientada A Objetos

Patrones De Diseño

PHP

Programación Orientada A Objetos

Introducción A Los Formularios En Php

PHP

Formularios

Procesamiento De Datos De Formularios

PHP

Formularios

Manejo De Archivos En Formularios

PHP

Formularios

Redirecciones Y Retroalimentación Al Usuario

PHP

Formularios

Formularios Dinámicos Y Separación De Lógica

PHP

Formularios

Introducción A La Persistencia En Php

PHP

Persistencia

Conexión A Bases De Datos

PHP

Persistencia

Consultas Y Operaciones Crud

PHP

Persistencia

Gestión De Transacciones

PHP

Persistencia

Manejo De Errores Y Excepciones En Base De Datos

PHP

Persistencia

Patrones De Acceso A Datos

PHP

Persistencia

Concepto De Sesiones En Php

PHP

Sesiones Y Cookies

Configuración De Sesiones

PHP

Sesiones Y Cookies

Cookies

PHP

Sesiones Y Cookies

Manejo Avanzado De Sesiones Y Cookies

PHP

Sesiones Y Cookies

Principales Vulnerabilidades En Php

PHP

Seguridad

Seguridad En Formularios Y Entrada De Datos

PHP

Seguridad

Protección Frente A Inyección Sql

PHP

Seguridad

Gestión De Contraseñas Y Cifrado

PHP

Seguridad

Seguridad En Sesiones Y Cookies

PHP

Seguridad

Configuraciones De Php Para Seguridad

PHP

Seguridad

Introducción Al Testing En Php

PHP

Testing

Phpunit

PHP

Testing

Cobertura De Código En Testing

PHP

Testing

Test Doubles (Mocks, Stubs, Fakes, Spies)

PHP

Testing

Pruebas De Integración Y Funcionales

PHP

Testing

Accede GRATIS a PHP y certifícate

En esta lección

Objetivos de aprendizaje de esta lección

  • 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.