Securización de PHP 8.1 en el servidor WEB
Medidas básicas de seguridad para el intérprete PHP

Asegurar PHP en un servidor Apache es crucial para proteger tu aplicación web contra vulnerabilidades comunes, como inyecciones SQL, cross-site scripting (XSS), y ejecución remota de código. Aquí tienes una guía detallada para maximizar la seguridad de PHP en un servidor Apache:


1. Actualiza PHP y Apache

  • Mantén PHP y Apache actualizados: Usa siempre la última versión estable de PHP y Apache, ya que incluyen parches de seguridad.

  • Elimina versiones antiguas de PHP: Si tienes versiones antiguas instaladas, desinstálalas para evitar riesgos.


2. Configuración Segura de PHP (php.ini)

El archivo php.ini es el núcleo de la configuración de PHP. A continuación, las directivas más importantes para mejorar la seguridad:

a. Deshabilitar Funciones Peligrosas

Deshabilita funciones que pueden ser explotadas, como exec, system, passthru, shell_exec, etc.


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

b. Habilitar Modo Estricto

Habilita el modo estricto para evitar advertencias y errores que puedan exponer información sensible.


display_errors = Off
log_errors = On
error_reporting = E_ALL

c. Limitar el Tamaño de las Entradas

Establece límites para evitar ataques de denegación de servicio (DoS) o sobrecarga del servidor.


post_max_size = 8M
upload_max_filesize = 2M
max_input_time = 60
max_execution_time = 30

d. Proteger contra Inyecciones SQL y XSS

Deshabilita magic_quotes_gpc y magic_quotes_runtime 

Las magic_quotes fueron una característica de PHP diseñada para ayudar a los desarrolladores a prevenir ataques de inyección SQL, un tipo de vulnerabilidad común en aplicaciones web. Esta característica, introducida en versiones antiguas de PHP (desde PHP 4 hasta PHP 5.3.0), automáticamente escapaba ciertos caracteres especiales en las entradas de usuario antes de que estos datos fueran utilizados en consultas a bases de datos. Sin embargo, esta funcionalidad fue ampliamente criticada y finalmente eliminada en PHP 5.4.0 debido a sus problemas inherentes y a la disponibilidad de mejores alternativas.

¿Qué Hacían las Magic Quotes?

Las magic_quotes funcionaban de la siguiente manera:

  1. Escapado Automático: Cuando las magic_quotes estaban habilitadas, PHP automáticamente añadía una barra invertida (\) antes de ciertos caracteres especiales en las entradas de usuario, como:

    • Comillas simples (')

    • Comillas dobles (")

    • Barras invertidas (\)

    • Caracteres nulos (\0)

  2. Ámbito de Aplicación:

    • magic_quotes_gpc: Afectaba a los datos provenientes de las superglobales $_GET, $_POST y $_COOKIE.

    • magic_quotes_runtime: Escapaba los datos generados o leídos desde archivos o bases de datos durante la ejecución del script.

    • magic_quotes_sybase: Cambiaba el comportamiento de las magic_quotes para usar un estilo de escapado compatible con Sybase (usando '' en lugar de \').


Si te encuentras con código antiguo que depende de las magic_quotes, es importante actualizarlo para eliminar esta dependencia.


magic_quotes_gpc = Off
magic_quotes_runtime = Off
magic_quotes_sybase = Off

e. Restringir el Acceso a Archivos

Usa open_basedir para limitar el acceso de PHP a directorios específicos.


open_basedir = /var/www/dominio1:/tmp

f. Deshabilitar la Ejecución Remota de Código

Evita que PHP incluya archivos remotos.


allow_url_fopen = Off
allow_url_include = Off

g. Habilitar session.cookie_httponly y session.cookie_secure

Protege las cookies de sesión contra ataques XSS y asegúrate de que solo se envíen sobre HTTPS.


session.cookie_httponly = 1
session.cookie_secure = 1

3. Configuración de Apache para PHP

Asegura la integración de PHP con Apache mediante las siguientes prácticas:

a. Usar Módulos de Seguridad

  • Habilita mod_security para proteger contra ataques comunes.

  • Habilita mod_evasive para prevenir ataques DDoS.

b. Restringir el Acceso a Archivos Sensibles

Bloquea el acceso a archivos sensibles como php.ini, .htaccess, y archivos de configuración.


<FilesMatch "\.(ini|htaccess|log|sh|sql)$">
    Require all denied
</FilesMatch>

c. Deshabilitar la Lista de Directorios

Evita que Apache muestre el contenido de los directorios.


Options -Indexes

d. Configurar Headers de Seguridad

Agrega headers de seguridad para proteger contra XSS, clickjacking, y MIME sniffing.


Header set X-Content-Type-Options "nosniff"
Header set X-Frame-Options "DENY"
Header set X-XSS-Protection "1; mode=block"
Header set Content-Security-Policy "default-src 'self'"

4. Proteger las Sesiones de PHP

  • Cambia el nombre de la cookie de sesión: Evita usar el nombre predeterminado PHPSESSID.


    session.name = MiSesionSegura
  • Usa almacenamiento seguro para sesiones: Almacena las sesiones en un directorio seguro con permisos restringidos.


    session.save_path = /var/lib/php/sessions
  • Regenera el ID de sesión: Regenera el ID de sesión después de un inicio de sesión exitoso.


    session_regenerate_id(true);

5. Validar y Sanitizar Entradas de Usuario

  • Usa funciones de filtrado: Valida y sanitiza todas las entradas de usuario con filter_var y filter_input.


    $email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
  • Prepara consultas SQL: Usa PDO o MySQLi con consultas preparadas para evitar inyecciones SQL.


    $stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
    $stmt->execute(['email' => $email]);

6. Configurar HTTPS

  • Usa certificados SSL/TLS: Configura Apache para servir PHP solo sobre HTTPS.

  • Redirige HTTP a HTTPS: Asegúrate de que todo el tráfico se redirija a HTTPS.


    <VirtualHost *:80>
        ServerName dominio.com
        Redirect permanent / https://dominio.com/
    </VirtualHost>

7. Monitoreo y Registro de Actividad

  • Habilita logs de PHP: Registra errores y actividad sospechosa.


    error_log = /var/log/php_errors.log
  • Monitorea los logs de Apache: Usa herramientas como fail2ban para bloquear IPs maliciosas.


8. Usar un Firewall de Aplicación Web (WAF)

  • Instala un WAF: Usa herramientas como ModSecurity para proteger contra ataques comunes.

  • Configura reglas personalizadas: Ajusta las reglas del WAF según las necesidades de tu aplicación.


9. Aislamiento de Procesos

  • Usa chroot o Docker: Aísla PHP en un entorno restringido para limitar el acceso al sistema de archivos.

  • Ejecuta PHP con un usuario dedicado: Usa un usuario sin privilegios para ejecutar PHP.


10. Pruebas de Seguridad

  • Escanea vulnerabilidades: Usa herramientas como OWASP ZAP o Nikto para identificar vulnerabilidades.

  • Realiza pruebas de penetración: Contrata a expertos en seguridad para evaluar tu aplicación.


Resumen de Configuraciones Clave en php.ini


disable_functions = exec,passthru,shell_exec,system,proc_open,popen,eval
display_errors = Off
log_errors = On
error_reporting = E_ALL
post_max_size = 8M
upload_max_filesize = 2M
max_input_time = 60
max_execution_time = 30
open_basedir = /var/www/dominio1:/tmp
allow_url_fopen = Off
allow_url_include = Off
session.cookie_httponly = 1
session.cookie_secure = 1
magic_quotes_gpc = Off magic_quotes_runtime = Off magic_quotes_sybase = Off

Siguiendo estas prácticas, puedes maximizar la seguridad de PHP en tu servidor Apache y proteger tu aplicación contra amenazas comunes.

Securización de PHP 8.1 en el servidor WEB
Shopicardiacom, S.L., David Casas 15 February, 2025
Share/Comparte post
Archive
Sign in to leave a comment


Securización avanzada de Apache WEB SERVER
Utilizando aislamiento chroot