Sto usando un'app java / scala per scrivere un server web (a scopo di apprendimento, quindi non sono permessi quadri). Ho pensato al modo seguente di implementare i token csrf, ma non sono sicuro che sia sicuro:
1 ogni pagina html include lo script "csrfToken.js" che contiene il token (var csrkToken="esempio") 2 quando viene richiesto questo file, il token csrf viene connesso al server (lungo l'ID utente per rendere il token utilizzabile solo da quel particolare utente). 3 quando si invia un post, si inserisce, si cancella, ecc. Il client legge il token dal file js e lo aggiunge alla richiesta 4 quando una richiesta di posta, posta, cancellazione, ecc. Raggiunge il server, il token viene controllato 5 se la richiesta è riuscita, il token viene eliminato e il sito aggiornato (per ottenere un nuovo token) 6 se non viene notificato al sito, il token non viene cancellato e può essere riutilizzato
Nota: i token hanno una durata massima (diciamo 30 minuti). Se il sito rimane aperto più a lungo (diciamo che la navigazione in più schede) viene notificato all'utilizzo che dovrebbe aggiornare il sito prima di procedere
I problemi principali qui sono:
- Il token può essere generato tramite richieste get (questa è una violazione del modo in cui le richieste get dovrebbero funzionare, ma non dovrebbe essere un problema di sicurezza perché lo stesso criterio di origine impedisce a un utente malintenzionato di leggere la risposta a una richiesta cross site)
- Non sono sicuro che wheteher o meno un utente malintenzionato possa leggere il token csrf degli utenti in un sito mallico e quindi utilizzarlo (il mio sito è sicuro xss)
- Non so se il mio token csrf che ha una vita breve fornisce effettivamente una sicurezza aggiuntiva o semplicemente diminuisce l'esperienza dell'utente (considera che il token è abbastanza lungo perché un attacco di forza bruta non sia un problema)
- Modifica: uno script csrf può generare molti token per creare molti token csrf per lo stesso utente. Questo è il motivo per cui desidero limitare il numero massimo di token csrf che un utente può avere in qualsiasi momento (diciamo che 25 dovrebbe essere sufficiente per ogni utente dato, ma non sono sire indipendentemente dal fatto che questo numero sia appropriato)
Se qualcuno potrebbe dirmi se la mia implementazione è sicura e / o come migliorarla, apprezzerei molto.