PHP: Seguridad

Profundiza en las mejores prácticas y técnicas de seguridad en PHP para salvaguardar tus aplicaciones web. Descubre cómo prevenir inyecciones, ataques XSS, robo de sesiones y otros riesgos habituales en el desarrollo con este lenguaje de programación.

Aprende PHP GRATIS y certifícate

La seguridad es un factor esencial en el desarrollo de aplicaciones web con PHP. Un descuido puede exponer datos confidenciales o permitir accesos no autorizados, comprometiendo la integridad del proyecto y la confianza de los usuarios. Dominar los fundamentos de la seguridad no solo protege la información, sino que también fortalece la reputación y la continuidad de tu aplicación.


Validación y sanitización de entradas

Todo dato que provenga de un usuario (formularios, variables de URL o archivos) debe considerarse no fiable. Para prevenir posibles ataques, se recomienda:

  1. Validar el tipo, el formato y la longitud de los campos (por ejemplo, direcciones de correo o números de teléfono).
  2. Sanitizar cadenas eliminando o transformando caracteres peligrosos:
    $variableSegura = htmlspecialchars($variableInsegura, ENT_QUOTES, 'UTF-8');
    
  3. Emplear funciones de PHP como filter_var() o ctype_* para comprobar patrones comunes (URLs, correos, números enteros, etc.).

Prevención de inyección SQL

El ataque de inyección SQL ocurre cuando un usuario malintencionado puede inyectar sentencias SQL a través de entradas. Para evitarlo:

  • Utiliza sentencias preparadas en PDO o MySQLi, enlazando los parámetros de forma segura:
    $stmt = $pdo->prepare("SELECT * FROM usuarios WHERE id = :id");
    $stmt->bindParam(':id', $id, PDO::PARAM_INT);
    $stmt->execute();
    
  • Nunca concatenes directamente variables recibidas con la sentencia SQL.
  • Limita los privilegios de la cuenta de acceso a la base de datos (no es recomendable usar cuentas con permisos de administrador para operaciones básicas).

Protección frente a XSS (Cross-Site Scripting)

El XSS consiste en inyectar código JavaScript en tu sitio. Para neutralizarlo, se aconseja:

  • Escapar todos los datos antes de mostrarlos en la página:
    echo htmlspecialchars($datoDelUsuario, ENT_QUOTES, 'UTF-8');
    
  • Utilizar las cabeceras de seguridad (por ejemplo, Content-Security-Policy) que restringen la ejecución de scripts no autorizados.
  • Validar las entradas para que no incluyan etiquetas <script> o caracteres especiales sin ser filtrados.

Control de sesiones y cookies

Mantener la seguridad en sesiones y cookies es fundamental, ya que un fallo permitiría a terceros suplantar la identidad de un usuario:

  1. Regenerar el ID de la sesión al iniciar sesión o cuando cambie el rol del usuario, para evitar la fijación de sesión:
    session_regenerate_id(true);
    
  2. Usar la marca HttpOnly en las cookies para prevenir accesos desde JavaScript:
    setcookie("nombre", "valor", ["httponly" => true, "secure" => true]);
    
  3. Implementar CSRF tokens (Cross-Site Request Forgery) en los formularios para validar que las solicitudes provengan realmente del usuario autenticado.

Gestión de errores y excepciones

Mostrar mensajes de error detallados en un entorno de producción puede revelar información sensible, como rutas de archivos o consultas SQL:

  • Configura display_errors en Off y log_errors en On en el archivo php.ini para almacenar los errores en un log interno en lugar de mostrarlos al usuario.
  • Atrapa y gestiona las excepciones con bloques try...catch, emitiendo mensajes genéricos al cliente y registrando la información técnica en archivos de log.

Actualizaciones y mantenimiento

Mantén PHP, las librerías y los frameworks siempre en sus versiones más recientes, ya que las actualizaciones suelen corregir vulnerabilidades críticas. De la misma forma:

  • Verifica dependencias con herramientas como Composer y revisa periódicamente los avisos de seguridad.
  • Emplea versionado y backup para poder restaurar el proyecto ante incidentes o fallos de seguridad.
  • Monitorea los registros de acceso y errores en busca de comportamientos anómalos.

Monitorización y auditoría

Una auditoría continua o periódica de la aplicación es esencial. Incluye:

  • Análisis de vulnerabilidades con herramientas automáticas que detectan configuraciones inseguras.
  • Pruebas manuales de penetración, simulando el acceso de un atacante.
  • Revisión de código por parte de otros miembros del equipo o especialistas en seguridad.

Recomendaciones finales

  • Principio de privilegios mínimos: Limita el acceso de cada componente a los recursos estrictamente necesarios.
  • Cifrado de información sensible: Aplica técnicas de cifrado o hashing en contraseñas y datos confidenciales.
  • Asegúrate de contar con copias de seguridad frecuentes para restaurar la aplicación en caso de intrusión o fallo grave.
Empezar curso de PHP

Lecciones de este módulo de PHP

Lecciones de programación del módulo Seguridad del curso de PHP.