Panoramica. Il consiglio standard è di utilizzare un token CSRF univoco che è unico per ogni richiesta. Perché? Poiché un token per richiesta è un po 'più resiliente a certi tipi di errori di implementazione rispetto a un token per sessione. Ciò rende i token per-request probabilmente la scelta migliore per lo sviluppo di nuove applicazioni web. Inoltre, nessun revisore della sicurezza ti assilla sull'utilizzo di un token CSRF per richiesta.
Se sei uno sviluppatore di applicazioni web, questo è tutto ciò che devi sapere e puoi smettere di leggere qui. Ma se sei un esperto di sicurezza che si chiede quale sia la logica dettagliata alla base di questo consiglio, o ti chiedi quanto sia grande il rischio se usi un token per sessione, continua a leggere ....
Scava un po 'più in profondità.
La verità è che, se non si hanno altre vulnerabilità nel proprio sito Web, un singolo token CSRF per sessione è OK. Non c'è motivo per cui devi avere per generare un nuovo token CSRF per richiesta.
Ciò è dimostrato dal fatto che troverai anche esperti di sicurezza affidabili che sostengono che un altro ragionevole modo per difendersi da CSRF è l'uso della doppia presentazione dei cookie: in altre parole, usi un Javascript sul lato client che calcola un hash del cookie di sessione e lo aggiunge a ciascuna richiesta POST, trattando l'hash come token CSRF. Puoi vedere che questo essenzialmente genera al volo un token CSRF che è lo stesso per l'intera sessione.
Naturalmente, conosco l'argomento per cui alcune persone potrebbero consigliare di generare un nuovo token CSRF per ogni richiesta. Stanno pensando, se si dispone anche di una vulnerabilità XSS sul proprio sito Web, se si utilizza un singolo token CSRF per sessione sarà facile utilizzare XSS per recuperare il token CSRF, mentre se si genera un nuovo token CSRF per richiesta, richiederà più lavoro per recuperare il token CSRF. Personalmente, non trovo questo argomento terribilmente convincente. Se hai una vulnerabilità XSS sul tuo sito, è ancora possibile recuperare i token CSRF anche se generi un nuovo token CSRF per ogni richiesta, bastano poche righe extra di Javascript dannoso. In entrambi i casi, se hai una vulnerabilità XSS sul tuo sito e affronti un aggressore serio e ben informato, è difficile garantire la sicurezza, indipendentemente dal modo in cui generi i token CSRF.
Nel complesso, non può fare male generare un nuovo token CSRF per ogni richiesta. E forse è meglio farlo in quel modo, solo per toglierti i controllori della sicurezza. Ma se hai già un'applicazione legacy che utilizza un singolo token CSRF per l'intera sessione, spendere i soldi per convertirla per generare un nuovo token CSRF per ogni richiesta probabilmente non sarebbe super-alta nella mia lista di priorità: scommetto che potrebbe trovare altri usi per quei soldi e l'energia degli sviluppatori che migliorerebbero ulteriormente la sicurezza.