Panoramica. Il consiglio standard è di utilizzare un token CSRF univoco che sia univoco per ogni richiesta. Perché? Perché un token per richiesta è leggermente più resistente a determinati tipi di errori di implementazione rispetto a un token per sessione. Ciò rende i token per richiesta probabilmente la scelta migliore per lo sviluppo di nuove applicazioni web. Inoltre, nessun revisore della sicurezza ti darà fastidio 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 e ti chiedi quale sia la logica dettagliata alla base di questo consiglio, o se ti stai chiedendo quanto sia grande il rischio se usi un token per sessione, continua a leggere ...
Scavando un po 'più a fondo. La verità è che, se non hai altre vulnerabilità nel tuo sito web, un singolo token CSRF per sessione è OK. Non c'è motivo per cui devi generare un nuovo token CSRF per richiesta.
Ciò è dimostrato dal fatto che troverai anche rispettabili esperti di sicurezza che affermano che un altro ragionevole Un modo per difendersi da CSRF è utilizzare il doppio invio dei cookie: in altre parole, si utilizza un Javascript lato client che calcola un hash del cookie di sessione e lo aggiunge a ogni richiesta POST, trattando l'hash come il 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 hai anche una vulnerabilità XSS sul tuo sito web, se usi un singolo token CSRF per sessione sarà facile usare XSS per recuperare il token CSRF, mentre se generi un nuovo token CSRF per richiesta, richiederà più lavoro per recuperare il token CSRF. Personalmente, non trovo questo un argomento estremamente convincente. Se hai una vulnerabilità XSS sul tuo sito, è comunque possibile recuperare i token CSRF anche se generi un nuovo token CSRF per ogni richiesta, bastano poche righe in più di Javascript dannoso. In ogni caso, se hai una vulnerabilità XSS sul tuo sito e affronti un aggressore serio e informato, è difficile garantire la sicurezza, indipendentemente da come generi i token CSRF.
Nel complesso, non può far male per generare un nuovo token CSRF per ogni richiesta. E forse è meglio farlo in questo modo, solo per toglierti di dosso i revisori della sicurezza. Ma se hai già un'applicazione legacy che utilizza un singolo token CSRF per l'intera sessione, spendere i soldi per convertirlo per generare un nuovo token CSRF per ogni richiesta probabilmente non sarebbe molto alto nella mia lista di priorità: scommetto che io potrebbe trovare altri usi per quei soldi e l'energia degli sviluppatori che migliorerebbero ulteriormente la sicurezza.