¿Es posible hacer que el botón de retroceso funcione si usamos un token CSRF por solicitud?

2

¿Debemos comprometernos con la navegación del botón Atrás si usamos un token CSRF por solicitud en lugar de un token por sesión?

(Logré usar un token por sesión sin ningún problema de navegación, pero no pude hacer lo mismo con un token CSRF por solicitud)

    
pregunta Girish 14.06.2016 - 06:56
fuente

2 respuestas

1

La solución utilizada en mis aplicaciones web (JSF) es decirle al navegador que realice una nueva solicitud GET en el navegador (o en la pestaña de reapertura). Esto se hace con el siguiente encabezado de respuesta HTTP:

Cache-Control: no-store, no-cache, must-revalidate
Expires: [in the past]

La primera línea es para HTTP 1.1, la segunda es para servidores Proxy.
Esto debería funcionar (al menos) en todos los navegadores principales.

Para obtener más información, consulte esta respuesta en StackOverflow

    
respondido por el DaniEll 14.06.2016 - 08:34
fuente
0

Creo que estás perdiendo el tiempo intentando implementar tokens por solicitud. D.W. Lo explica en esta respuesta :

  

Por supuesto, conozco el argumento por el que algunas personas pueden recomendar generar un nuevo token CSRF para cada solicitud. Están pensando que, si también tiene una vulnerabilidad XSS en su sitio web, si usa un solo token CSRF por sesión, será fácil usar XSS para recuperar el token CSRF, mientras que si genera un token CSRF nuevo por solicitud, Tomará más trabajo para recuperar el token CSRF.

     

Personalmente, no considero que este sea un argumento terriblemente convincente. Si tiene una vulnerabilidad XSS en su sitio, aún es posible recuperar tokens CSRF, incluso si genera un token CSRF nuevo para cada solicitud, solo se necesitan algunas líneas adicionales de Javascript malintencionado. De cualquier manera, si tienes una vulnerabilidad XSS en tu sitio y te enfrentas a un atacante serio y experto, es difícil garantizar la seguridad, sin importar cómo generes tus tokens CSRF.

Dicho esto, si aún desea hacer esto, quizás funcione el siguiente enfoque:

  • Cuando se carga un formulario, realice una llamada AJAX con JavaScript a getCsrfToken.php o algo así. Asegúrese de tener CORS estricto en este caso.
  • En el lado del servidor, genere un token aleatorio si la sesión es válida y envíelo de vuelta al cliente.
  • Es posible que desee no validar todos los tokens antiguos para esa sesión. Sin embargo, esto causará problemas si el usuario abre su sitio en varias pestañas. Por otro lado, si no lo haces, ¿cuál es el punto?

Acabo de imaginar esta solución ahora, así que véala más como una sugerencia para evaluar que como una respuesta segura definitiva.

    
respondido por el Anders 14.06.2016 - 10:45
fuente

Lea otras preguntas en las etiquetas