Attualmente sto costruendo un'applicazione a singola pagina con un front-end JavaScript / HTML. Il front-end effettua chiamate a un'API WEB che è stata scritta in .NET. Attualmente ho una pagina HTML in cui un utente inserisce le proprie credenziali e fa clic su login. Una richiesta AJAX viene quindi inviata all'API WEB che autentica l'utente e restituisce un cookie solo HTTP contenente un token Web Json. Il browser invia quindi questo cookie su ogni richiesta successiva e il controllore lo convalida.
Quanto sopra funziona bene, tuttavia manca la protezione CSRF. Sto cercando di capire il modo migliore di implementarlo. Dalla mia ricerca, sembra che ci siano alcune opzioni.
-
L'articolo all'indirizzo link suggerisce di estrarre un token da un cookie e quindi inviarlo come intestazione di richiesta. Per fare ciò, dovrei rilasciare il flag Solo HTTP, in modo che il JavaScript possa accedere al cookie. Non penso che questa sia la soluzione migliore, in quanto potrebbe esporre le informazioni sulla sessione se viene rilevata una vulnerabilità XSS. C'è qualcosa che mi manca?
-
Da qualche altra parte ho letto sull'invio di un cookie separato che conteneva il token CSRF e ne estraeva il valore con JavaScript. Quindi inviando il valore come intestazione personalizzata alle richieste AJAX successive e facendo convalidare l'API WEB in base a tale intestazione. Ho scritto una rapida dimostrazione di applicazione concettuale per questo e ho scoperto che il browser invierà ancora il cookie, il token CSRF è stato consegnato in coda alle richieste future. Questo pone un problema? Potrebbe una pagina con un attacco CSRF in qualche modo sfruttare questo?
-
Simile a quanto sopra, ma invece di consegnare il token CSRF tramite un cookie, consegnarlo tramite un'intestazione personalizzata e fare in modo che JavaScript lo legga da lì. Sembra che sia il più semplice, ma vedi qualche inconveniente con questo approccio?
Inoltre, è sicuro continuare a utilizzare un singolo token CSRF per l'intera sessione di un utente o dovrebbe essere aggiornato ad ogni richiesta?