Diciamo che ho quell'applicazione web che ha una protezione CSRF secondo Pattern token di sincronizzazione . Il server si aspetta un token CSRF valido in ogni richiesta POST quando l'utente è autenticato. Ora immagina il seguente scenario:
-
L'utente apre una scheda del browser (scheda
anonymous
) e avvia alcune funzionalità AJAX che periodicamente legge dal server (ad esempio un timestamp). L'utente non è autenticato in questa scheda. -
L'utente apre una nuova scheda del browser (scheda
authenticated
) ed esegue un accesso lì. Se ora carica il framework AJAX, il token CSRF viene scritto nel codice sorgente del framework AJAX da parte del server include e viene memorizzato nella variabiletoken
. -
Se il prossimo sondaggio automatico viene eseguito dalla scheda
anonymous
, il cookie di sessione viene inviato indicando un utente connesso ma questa scheda non ha mai ricevuto un token CSRF poiché il framework AJAX è stato caricato prima eseguire il login sulla schedaauthenticated
.
Ciò comporterà un errore generato dal server perché ha ricevuto un token di sessione valido senza token di protezione CSRF.
Come posso superare questo?
Modifica
Le cose peggiorano ancora se l'utente
- esegue un login nella scheda 1 (
user1
) - apre la scheda 2
- esegue un logout nella scheda 2
- esegue un nuovo accesso nella scheda 2 (utente diverso,
user2
)
In questo caso, la prima scheda fornisce il token CSRF precedentemente valido di user1
ma il cookie di sessione inviato appartiene a user2
registrato nella scheda 2. Questo deve portare a un errore emesso dalla protezione CSRF (a proposito, in termini di codici di errore HTTP: cosa usare? 403
sembra come se potesse essere usato, ma non sono sicuro).
Sentirsi ora come l'intera cosa CSRF potrebbe essere risolta in modo molto bello in teoria, ma potrebbe usare un po 'di riflessione in tempi di AJAX.
Esiste una soluzione canonica per il problema sopra descritto? Oppure gli utenti accettano semplicemente di dover ricaricare una pagina a causa di elementi di sicurezza - cose che non ti piacciono?