Ho un'app web in cui, quando gli utenti richiedono una pagina, viene generato un token CSRF e immesso nella pagina jsp in un campo input nascosto.
Lo stesso token viene quindi inviato al server per ogni chiamata AJAX in un'intestazione personalizzata mentre, un token dello stato sessione è contenuto in un cookie ( secure + httpOnly ).
Ora, dato che il token CSRF è qualcosa di nuovo nella webapp, se dopo l'aggiornamento l'utente era già loggato e lui invia una richiesta, un Filter determinerà che è effettivamente registrato (a causa della sessione -state token nel cookie), ma un token CSRF valido non è contenuto nell'intestazione personalizzata, quindi il comportamento definito è di disconnetterlo.
Potrei occuparmi di questo, seguendo questo esempio OWASP .
Se non è presente un token CSRF , ho intenzione di inviare una richiesta NO-CONTENT indietro e in qualche modo fornire il token.
Ecco il primo dubbio:
Il tag CSRF non deve essere inserito in un cookie ?.
Inoltre forniscono un token CSRF indietro se manca nella richiesta, il che mi sembra un po 'di anti-secure : un utente malintenzionato potrebbe aver rubato il token di sessione da cookie , inviare una richiesta e ricevere magicamente il token CSRF indietro.
Mi sento quindi confuso qui.
- Devo solo inserire il token
CSRFnel cookie lungo il token di stato della sessione? - Dovrei evitare di fornire un token
CSRFse non ne è impostato nessuno, ma esiste un cookie di stato sessione? - Quale può essere una soluzione alternativa per il mio caso?
Note:
Prima di controllare il token CSRF, verifico le intestazioni origin e referer , come consigliato qui .
Non ho intenzione di implementare un token CSRF use-only-one-per-request .
Sebbene irrilevante in questo contesto, la comunicazione avviene tramite HTTPS