php - solutions - Colisiones de tokens CSRF con múltiples pestañas
html form without csrf protection (2)
Construí protección CSRF en mi aplicación, simplemente generando un token aleatorio en cada carga de página, poniéndolo en sesión y luego enlazando el token al atributo de etiqueta <body>
como:
<body data-csrf-token="csrf_GeJf53caJD6Q5WzwAzfy">
Luego, en cada acción de formulario o solicitud ajax, simplemente tomo el token de la etiqueta del cuerpo y lo envío.
Esto funciona muy bien, excepto por un gran problema. Los usuarios están abriendo varias pestañas de la aplicación y estoy viendo colisiones de fichas. Por ejemplo, un usuario carga la primera página y genera un token, luego cambian las pestañas, cargan otra página, lo que genera un nuevo token. Finalmente, vuelven a la primera página y envían una acción de formato. Esto da como resultado un error de token CSRF no válido.
¿Cuál es la mejor manera de rediseñar esto para evitar colisiones con múltiples pestañas, a la vez que lo mantiene lo más seguro posible?
¿Es simplemente generar un único token al iniciar sesión la solución correcta, en lugar de generar un nuevo token en cada carga de página?
Puede utilizar un único token al iniciar sesión. Como @ Josh3736 señala, esto funciona bien.
Si realmente desea tener un token por página, puede almacenar una matriz de tokens válidos en $ _SESSION. Luego, expirarían tokens individuales a medida que se usan. Opcionalmente, también podría caducar después de un período de tiempo de espera, pero eso solo es significativo si el tiempo de espera es más corto que el tiempo de espera de su sesión. Pero, de nuevo, ¿qué estás logrando realmente con esto? Un solo token está perfectamente bien para propósitos de CSRF.
Suponiendo que su aplicación está protegida con SSL, entonces realmente no se crea ningún valor al generar nuevos tokens en cada carga de página. No detiene a un atacante que ha explotado una vulnerabilidad de XSS; de todos modos, tendrían acceso al token recién generado.
Recuerda lo que defiende un token CSRF: una página maliciosa de terceros que intenta ciegamente publicar datos en tu aplicación con la esperanza de que el usuario haya iniciado sesión. En este tipo de ataque, el atacante nunca tendría acceso al token CSRF, por lo que cambia Con frecuencia no hace bien.
No pierda tiempo y recursos en el seguimiento de múltiples tokens por sesión. Solo genera uno al principio y listo.