Descripción general. El consejo estándar es utilizar un token CSRF único que sea único para cada solicitud. ¿Por qué? Debido a que un token por solicitud es un poco más resistente a ciertos tipos de errores de implementación que un token por sesión. Esto hace que los tokens por solicitud sean la mejor opción para el desarrollo de nuevas aplicaciones web. Además, ningún auditor de seguridad lo molestará con el uso de un token CSRF por solicitud.
Si eres un desarrollador de aplicaciones web, esto es todo lo que necesitas saber, y puedes dejar de leer aquí. Pero si es un experto en seguridad que se pregunta sobre los fundamentos detallados de este consejo, o si se pregunta qué tan grande es el riesgo si usa un token por sesión, siga leyendo ...
Profundizando un poco más.
La verdad es que, si no tiene otras vulnerabilidades en su sitio web, un solo token CSRF por sesión está bien. No hay ninguna razón por la que necesariamente tengas para generar un token CSRF nuevo por solicitud.
Esto se demuestra por el hecho de que también encontrará expertos de seguridad acreditados que dicen que otra forma razonable de defenderse contra CSRF es usar el envío doble de cookies: en otras palabras, usa un Javascript del lado del cliente que calcula un hash de la cookie de sesión y agrega eso a cada solicitud POST, tratando el hash como el token CSRF. Puede ver que esto esencialmente genera sobre la marcha un token CSRF que es el mismo para toda la sesión.
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 argumento sea 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.
En general, no se debe dejar de generar un nuevo token CSRF para cada solicitud. Y tal vez es mejor hacerlo de esa manera, solo para que los auditores de seguridad se retiren de su espalda. Pero si ya tiene una aplicación heredada que usa un solo token CSRF para toda la sesión, gastar el dinero para convertirlo para generar un nuevo token CSRF para cada solicitud probablemente no sería muy alto en mi lista de prioridades: apuesto a que podría encontrar otros usos para ese dinero y la energía del desarrollador que mejoraría aún más la seguridad.