Con cookie anonimi
Se sei felice di generare token sicuri che sono impostati come cookie di utenti anonimi, ma non di archiviarli lato server, potresti semplicemente invio doppio cookie .
es. Utente legittimo:
- Anon utente naviga verso la pagina di login, riceve il cookie che viene inviato al browser.
- Anon esegue l'accesso e il browser invia il cookie come intestazione e come valore nascosto del modulo.
- Utente ora loggato
Questo non può essere maltrattato dall'attaccante in quanto ora succederà:
- L'utente malintenzionato crea un account host nel dominio trusted
- L'utente malintenzionato crea una richiesta di accesso nel browser della vittima con le credenziali dell'account host Tuttavia, l'utente malintenzionato non ha accesso al valore del cookie della vittima e non può crearlo come token CSRF nel corpo della richiesta. L'attacco fallisce.
Anche se il tuo sito è accessibile solo tramite HTTPS e imposti correttamente la Bandiera protetta , devi fare attenzione con questo approccio come attaccante potrebbe potenzialmente MiTM qualsiasi connessione dalla vittima a qualsiasi sito Web HTTP (se l'autore dell'attacco è opportunamente collocato, ovviamente), reindirizzali al tuo dominio su HTTP, che è anche MiTM e quindi imposta il valore del cookie richiesto. Questo sarebbe un attacco Correzione della sessione . Per evitare questo, è possibile visualizzare il valore del cookie nell'intestazione e nel campo modulo nascosto ogni momento in cui questa pagina (di accesso) viene caricata (su HTTPS) anziché riutilizzare un valore di cookie già impostato. Questo perché sebbene un browser possa impostare il Flag sicuro, invierà comunque i cookie senza il Flag sicuro su una connessione HTTPS e il server non sarà in grado di stabilire se è stato impostato il Flag sicuro. (Gli attributi dei cookie come il Flag di sicurezza sono visibili solo quando il cookie è impostato, non quando viene letto. L'unica cosa che il server può vedere è il nome e il valore del cookie.) Implementazione di HSTS sarebbe una buona opzione per la protezione nei browser supportati.
Si consiglia di impostare X-Frame-Options a prevenire un attacco di tipo click jacking (altrimenti l'attaccante potrebbe usare la funzionalità del sito per riempire il proprio nome utente e password in attesa che l'utente clicchi e li invii insieme al valore CSRF).
Senza cookie anonimi
Se non si desidera impostare i cookie per gli utenti anonimi (che potrebbero quindi sospettare di essere monitorati dal lato server), è possibile utilizzare il seguente approccio: Un modulo di accesso a più fasi.
Il primo stadio è la solita combinazione nome utente / password.
Dopo che il modulo è stato inviato, reindirizza a un altro modulo. Questo modulo è protetto da un cookie di token di autenticazione intermedia speciale e un token CSRF. L'autenticazione qui consentirà l'inoltro dell'autenticazione della seconda fase, ma non consentirà altre azioni sull'account (tranne eventualmente un logout completo). Questo abiliterà il token CSRF ad essere associato e utilizzato da questo account utente solo su questa sessione intermedia.
Ora è solo quando viene inviato questo modulo, inclusi il token cookie e il valore nascosto del modulo CSRF che l'utente è completamente autenticato con il dominio. Qualsiasi utente malintenzionato che tenta un attacco CSRF non sarà in grado di recuperare il token CSRF e il suo tentativo di accesso completo avrà esito negativo.
L'unico inconveniente è che l'utente dovrà fare clic manualmente per completare il login, che può essere un'esperienza utente goffo. È consigliabile impostare X-Frame-Options per evitare che questo sia usato in combinazione con un attacco di click jacking di riparazione dell'interfaccia utente. Qualsiasi invio automatico con JavaScript sarebbe vantaggioso per l'utente malintenzionato e farebbe sì che il loro attacco potesse avere successo, quindi al momento posso vedere solo un clic manuale da parte dell'utente che lavora.
Ora funzionerebbe in questo modo:
- L'utente malintenzionato crea un account host nel dominio trusted
- L'utente malintenzionato crea una richiesta di accesso nel browser della vittima con le credenziali dell'account host ma non può procedere oltre la fase due per diventare completamente autenticato
- L'hacker induce la vittima a utilizzare il sito attendibile - ma poiché non sono completamente autenticati, il sito agirà come se l'utente non fosse autenticato