Digamos que tengo esa aplicación web que tiene una protección CSRF de acuerdo con Patrón del token del sincronizador . El servidor espera un token CSRF válido en cada solicitud POST cuando el usuario está autenticado. Ahora imagine el siguiente escenario:
-
El usuario abre una pestaña del navegador (pestaña
anonymous
) e inicia alguna funcionalidad AJAX que lee periódicamente desde el servidor (por ejemplo, una marca de hora). El usuario está no autenticado en esta pestaña. -
El usuario abre una nueva pestaña del navegador (pestaña
authenticated
) y realiza un inicio de sesión allí. Si ahora carga el marco AJAX, el token CSRF se escribe en el código fuente del marco AJAX por parte del servidor y se almacena en la variabletoken
. -
Si la siguiente encuesta automática se realiza desde la pestaña
anonymous
, la cookie de la sesión se envía para indicar que el usuario ha iniciado sesión, pero esta pestaña nunca recibió un token CSRF desde que se cargó el marco AJAX antes de realizando el inicio de sesión en la pestañaauthenticated
.
Esto provocará un error lanzado por el servidor porque recibió un token de sesión válido sin el token de protección CSRF.
¿Cómo puedo superar esto?
Editar:
Las cosas se ponen aún peor si el usuario
- hace un inicio de sesión en la pestaña 1 (
user1
) - abre la pestaña 2
- hace un cierre de sesión en la pestaña 2
- realiza un nuevo inicio de sesión en la pestaña 2 (usuario diferente,
user2
)
En ese caso, la primera pestaña proporciona el token CSRF anteriormente válido de user1
pero la cookie de la sesión enviada pertenece a user2
conectado en la pestaña 2. Esto debe conducir a un error emitido por la protección CSRF (por cierto, en términos de códigos de error HTTP: ¿qué usar? 403
parece como si pudiera usarse, pero no estoy seguro).
Sentirse como si todo el CSRF pudiera resolverse muy bien en teoría pero podría ser útil en tiempos de AJAX.
¿Hay alguna solución canónica para el problema descrito anteriormente? ¿O los usuarios simplemente aceptan que tienen que volver a cargar una página debido a cosas de seguridad que no coinciden?