Las solicitudes GET deben ser idempotentes, lo que significa que no puede invalidar el token una vez que se usa porque cualquier solicitud de repetición no dará la misma respuesta.
Las solicitudes GET tampoco deben realizar cambios de estado en el sistema, por lo tanto, no se debe requerir que tengan protección CSRF. Incluso el cierre de sesión no debe ser una solicitud GET para el método que realmente ejecuta el cierre de sesión (aunque podría tener un enlace GET que navega a otra página antes de que una solicitud POST realice la acción).
Para solucionar el problema idempotente, con una solicitud GET repetida y con el mismo token CSRF suministrado, puede mostrar la respuesta almacenada en caché desde la primera solicitud, sin realizar ningún cambio de estado. Sin embargo, aún está violando el estándar si realiza cambios de estado, consulte rfc7231 :
Los métodos de solicitud se consideran "seguros" si sus semánticas definidas son
esencialmente solo lectura
De los métodos de solicitud definidos por esta especificación, el GET, HEAD,
Las opciones y los métodos TRACE se definen como seguros.
Como nota al margen, también argumentaría que los procesos que requieren un uso intensivo de recursos también deberían ser POST (con protección CSRF) en lugar de GET, de lo contrario, un atacante podría hacer un sistema DoS utilizando un vector CSRF.
Por lo tanto, si necesita CSRF para un método, entonces no implemente esto como un GET.