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.