Tengo una aplicación web en la que, cuando los usuarios solicitan una página, se genera un token CSRF
y se inyecta en la página jsp
en un campo oculto input
.
El mismo token se envía al servidor para cada llamada AJAX en un encabezado personalizado, mientras que un token de estado de sesión está contenido en una cookie ( secure
+ httpOnly
).
Ahora, dado que el token CSRF
es algo nuevo en la aplicación web, si después de la actualización el usuario ya inició sesión y envía una solicitud, un Filter
determinará que en realidad está registrado (debido a la sesión (el token de estado en la cookie), pero un token CSRF
válido no está contenido en el encabezado personalizado, por lo que el comportamiento definido es desconectarlo.
Puedo lidiar con esto, siguiendo este OWASP ejemplo.
Si un token CSRF
no está presente, tengo la intención de enviar una solicitud de NO-CONTENT
y de alguna manera proporcionar el token.
Aquí está la primera duda:
¿No debería el el token CSRF no se debe colocar en una cookie ?
Además, están devolviendo un token CSRF
si falta en la solicitud, lo que me parece un poco de anti-secure
: un atacante podría haber robado el token de sesión del cookie
, enviar una solicitud y recibir mágicamente el token CSRF
de vuelta.
Por lo tanto, me siento confundido aquí.
- ¿Debo colocar el token
CSRF
en la cookie junto con el token de estado de sesión? - ¿Debo evitar proporcionar un token
CSRF
si no se establece ninguno, pero existe una cookie de estado de sesión? - ¿Cuál puede ser una solución alternativa para mi caso?
Notas:
Antes de verificar el token CSRF, verifico los encabezados origin
y referer
, como se aconseja here .
No planeo implementar un token use-only-one-per-request
CSRF .
Aunque no es relevante en este contexto, la comunicación se realiza a través de HTTPS