Glosario

Qué es la fijación de sesión: hacer que una víctima inicie sesión con un ID que el atacante ya conoce

La fijación de sesión hace que la víctima use un ID de sesión plantado por el atacante. Cómo funciona y la defensa principal: regenerar el ID al iniciar sesión.

Publicado 2026-06-11 Actualizado 2026-10-06 7 min de lectura
En esta página

La fijación de sesión es cuando la víctima inicia sesión con un ID que el atacante preparó. Aquí tienes cómo funciona y cómo prevenirla de forma fiable (sin pasos de ataque).

Por qué funciona

La causa es un diseño donde el ID de sesión no cambia al iniciar sesión. Si no cambia, un ID que el atacante conocía antes del inicio de sesión sigue funcionando como «autenticado» después del inicio de sesión.

1) El atacante consigue que la víctima use un ID de sesión conocido (vía un enlace, etc.)
↓ la víctima inicia sesión con ese ID aún fijado
2) El ID no se regenera = el mismo ID queda «autenticado»
↓ el atacante conocía ese ID todo el tiempo
3) Acceder con el mismo ID = suplantar a la víctima
Si el ID no cambia al iniciar sesión, un ID que el atacante conocía de antemano queda autenticado tal cual.

Puede combinarse con CSRF o XSS, pero la esencia de la fijación en sí es una sola cosa: el ID no se regeneró al iniciar sesión.

La guía de la IPA de Japón (Information-technology Promotion Agency) «How to Secure Your Website» la trata como una forma de gestión de sesiones inadecuada y advierte que todo sitio web con función de inicio de sesión debe vigilarla. Su corrección de fondo es iniciar una sesión nueva tras un inicio de sesión correcto.

Fijación frente a secuestro de sesión y CSRF

Estos tres se confunden con facilidad. Todos abusan de una sesión iniciada, pero difieren en qué tiene el atacante y qué defensa funciona.

AspectoFijación de sesiónSecuestro de sesiónCSRF
Qué tiene el atacanteUn ID que preparó él (lo conoce desde el principio)Un ID ya emitido que ha robadoNingún ID
Qué le pasa a la víctimaInicia sesión con el ID plantadoLe roban el ID ya emitidoLe hacen enviar una petición que no pretendía
Defensa principalRegenerar el ID al iniciar sesiónHttpOnly/Secure, prevención de XSS, vidas cortasTokens CSRF, SameSite

La fijación es la que un único paso, regenerar el ID al iniciar sesión, corrige de raíz.

Defensa: regenera el ID al iniciar sesión

1

Regenera el ID de sesión al iniciar sesión con éxito (lo más importante)

En el instante en que la autenticación tiene éxito, descarta el ID antiguo y emite un nuevo ID de sesión (el session regenerate/renew de la mayoría de los frameworks). Cualquier ID plantado de antemano queda invalidado de inmediato. Regenera también en la escalada de privilegios (por ejemplo, al convertirse en administrador).
2

No aceptes IDs de sesión por la URL

Maneja el ID de sesión en una cookie e ignora un ID especificado en un parámetro de URL. Cierra la vía que un atacante usa para hacer que una víctima adopte un ID 'fijado'.
3

Configura las marcas de la cookie

Configura las cookies de sesión con HttpOnly (JS no puede leerlas), Secure (solo HTTPS) y SameSite (frena el envío entre sitios). Debilita en conjunto las vías de secuestro relacionadas.
4

Caduca las sesiones con criterio

Caduca por inactividad, cierre de sesión y cambio de contraseña para que un ID fijado no siga siendo válido indefinidamente.

La OWASP Session Management Cheat Sheet recomienda regenerar el ID en cada cambio de privilegios y usar un mecanismo «estricto» que solo acepte IDs generados por el propio servidor. Un mecanismo «permisivo» que adopta un ID desconocido traído de fuera deja margen para que se acepte un ID elegido por el atacante.

Qué hacen por defecto los frameworks habituales

La mayoría de los frameworks regeneran el ID automáticamente si usas su inicio de sesión estándar. El riesgo aparece cuando escribes tú el inicio de sesión o desactivas la protección predeterminada.

EntornoComportamiento predeterminadoQué revisar si lo escribes tú
PHP (sesiones nativas)No regenera por sí solo; session.use_strict_mode vale 0 por defectoLlama a session_regenerate_id(true) al iniciar sesión con éxito; pon use_strict_mode a 1
LaravelSe regenera automáticamente al autenticar si usas un starter kit o FortifySi escribes el inicio de sesión a mano, llama a $request->session()->regenerate()
Spring SecurityActivado por defecto (changeSessionId en Servlet 3.1+)Asegúrate de que nadie ha configurado sessionFixation().none()

En PHP, las opciones que pasan los IDs de sesión por la URL (activar session.use_trans_sid, desactivar session.use_only_cookies) quedaron obsoletas en PHP 8.4. Si arrastras un archivo de configuración antiguo, revísalas.

Cómo revisar tu propio sitio

En un sitio que administres, comprueba estas cuatro cosas. Solo necesitas las herramientas de desarrollo.

  1. En las herramientas de desarrollo, en «Application» (Firefox: «Storage»), anota el valor de la cookie de sesión y vuelve a mirarlo tras iniciar sesión. Si no ha cambiado, el ID no se regenera al iniciar sesión
  2. Comprueba que ni la página de inicio de sesión ni las URLs posteriores llevan un ID de sesión como PHPSESSID= o ;jsessionid=
  3. En el mismo panel, comprueba que la cookie de sesión tiene HttpOnly, Secure y SameSite
  4. Tras cerrar sesión, vuelve a poner el valor antiguo de la cookie y recarga; confirma que no vuelves a tener la sesión iniciada

Los atributos de las cookies también los revisa la auditoría de seguridad del sitio, que analiza sitios cuya propiedad has verificado. Si conviertes la comprobación 1 en una prueba automática cada vez que tocas el flujo de inicio de sesión, notarás enseguida si la regeneración desaparece.

La visión de este sitio: no desactives el 'regenerate' del framework

La fijación de sesión se previene en gran medida con un solo paso: regenerar el ID al iniciar sesión, no con código personalizado elaborado. La clave es no desactivar por accidente ni olvidarse de llamar al mecanismo que tu framework ya proporciona. Usar los valores predeterminados seguros de una implementación probada supera a montar tu propia gestión de sesiones a mano. En este sitio nos atenemos a «no construyas tú mismo la autenticación/gestión de claves; no desactives los valores predeterminados seguros». Como con el IDOR, la autenticación/autorización debe imponerse mediante un mecanismo en cada solicitud.

Fuentes (primarias)

  • IPA, «How to Secure Your Website», 1.4 Gestión de sesiones inadecuada — ipa.go.jp (en japonés; iniciar una sesión nueva tras el inicio de sesión; no poner IDs en la URL)
  • OWASP Session Management Cheat Sheet — cheatsheetseries.owasp.org (en inglés; regeneración al cambiar de privilegios, mecanismo estricto, atributos de cookie)
  • MITRE CWE-384: Session Fixation — cwe.mitre.org (en inglés)
  • Manual de PHP, «Runtime Configuration» (sesiones) — php.net (en inglés; valores predeterminados como use_strict_mode; obsolescencias de 8.4)
  • Documentación de Laravel, «HTTP Session» — laravel.com / Spring Security, «Authentication Persistence and Session Management» — docs.spring.io (en inglés)

Sigue leyendo

Clasificación

CWE clasifica los tipos de debilidad que causan las vulnerabilidades; MITRE ATT&CK clasifica las técnicas de los atacantes. Ambos los mantiene MITRE y se usan ampliamente para etiquetar vulnerabilidades y reglas de detección.

CWE (tipo de debilidad)

CWE™: Copyright © 2006–2026, The MITRE Corporation. CWE is a trademark of The MITRE Corporation. The MITRE Corporation hereby grants you a non-exclusive, royalty-free license to use CWE for research, development, and commercial purposes. Any copy you make for such purposes is authorized on the condition that you reproduce MITRE’s copyright designation and this license in any such copy. CWE Terms of Use

FAQ

Q¿En qué se diferencia la fijación del secuestro de sesión?
A

El secuestro roba un ID de sesión ya emitido a alguien. La fijación es lo contrario: el atacante consigue que la víctima use un ID que el atacante ya conoce, y luego espera a que la víctima inicie sesión con él. No roba: consigue que un ID conocido por el atacante quede autenticado.

Q¿Cuál es la mejor defensa?
A

Regenerar el ID de sesión en el momento del inicio de sesión. La mayoría de los frameworks/librerías de sesión tienen esto (session regenerate/renew): al autenticarse con éxito, descarta el ID antiguo y emite uno nuevo. Eso por sí solo invalida cualquier ID que el atacante plantara de antemano. Regenera también en los cambios de privilegios (por ejemplo, al convertirse en administrador).

Q¿Por qué es peligroso poner un ID de sesión en la URL?
A

Un ID en la URL se filtra con facilidad mediante enlaces compartidos, la cabecera Referer, los registros y el historial del navegador, lo que da a un atacante una forma de hacer que la víctima use un ID 'fijado'. Maneja los IDs de sesión en cookies, no en parámetros de URL, y no aceptes un ID especificado mediante la URL.

Q¿Cómo compruebo si mi sitio es vulnerable a la fijación de sesión?
A

En tu propio sitio, abre las herramientas de desarrollo del navegador y compara el valor de la cookie de sesión antes y después de iniciar sesión. Si el valor es el mismo tras el inicio de sesión, el ID no se está regenerando y tienes que corregirlo. Comprueba también que ningún ID de sesión aparece en la URL y que la cookie tiene HttpOnly, Secure y SameSite.

Q¿Qué configuración de PHP evita la fijación de sesión?
A

Llama a session_regenerate_id(true) al iniciar sesión con éxito para pasar a un ID nuevo. En php.ini, pon session.use_strict_mode a 1 para que el servidor rechace IDs que no emitió él (el valor predeterminado es 0). Mantén session.use_only_cookies en su valor predeterminado 1 y session.use_trans_sid en su valor predeterminado 0 para que los IDs nunca viajen en la URL.

QSi uso JWT, ¿puede seguir habiendo fijación de sesión?
A

Si no usas un ID de sesión del lado del servidor y emites un token nuevo al iniciar sesión con éxito, el ataque de «conseguir que un ID elegido de antemano quede autenticado» es difícil de llevar a cabo. Pero si un token emitido antes del inicio de sesión se sigue usando después, puede darse el mismo problema. Sea cual sea el mecanismo, la regla es emitir un identificador nuevo en el momento del inicio de sesión.