Dobbiamo archiviare JWT sul computer client. Se lo memorizziamo in un LocalStorage / SessionStorage, può essere facilmente catturato da un attacco XSS. Se lo memorizziamo nei cookie, un hacker può utilizzarlo (senza leggerlo) in un attacco CSRF e impersonare l'utente e contattare la nostra API e inviare richieste per eseguire azioni o ottenere informazioni per conto di un utente.
Ma ci sono diversi modi per proteggere il JWT nei cookie per non essere rubato facilmente (ma ci sono ancora alcune tecniche avanzate per rubarli). Ma se vuoi affidarti a LocalStorage / SessionStorage, puoi accedervi con un semplice attacco XSS.
Quindi, per risolvere il problema CSRF, utilizzo i cookie Double Submit nella mia applicazione.
Metodo di invio doppio dei cookie
Conservare JWT in un cookie HttpOnly e utilizzarlo in modalità protetta per trasferire su HTTPS.
La maggior parte degli attacchi CSRF ha un'intestazione di origine o referrer diversa con l'host originale nelle loro richieste. Quindi controlla se ne hai qualcuno nell'intestazione, vengono dal tuo dominio o no! In caso contrario, respingerli. Se l'origine e il referrer non sono disponibili nella richiesta, non preoccuparti. Puoi fare affidamento sul risultato dei risultati di convalida dell'intestazione X-XSRF-TOKEN che spiegherò nel passaggio successivo.
Mentre il browser fornirà automaticamente i cookie per il dominio della richiesta, esiste una limitazione utile: il codice JavaScript in esecuzione su un sito Web non può leggere i cookie di altri siti Web. Possiamo sfruttare questo per creare la nostra soluzione CSRF. Per prevenire attacchi CSRF, dobbiamo creare un cookie leggibile Javascript aggiuntivo che si chiama: XSRF-TOKEN. Questo cookie deve essere creato quando l'utente ha effettuato l'accesso e deve contenere una stringa casuale e non indovinabile. Salviamo anche questo numero nel JWT stesso come reclamo privato. Ogni volta che l'applicazione JavaScript vuole fare una richiesta, dovrà leggere questo token e inviarlo in un'intestazione HTTP personalizzata. Poiché queste operazioni (lettura del cookie, impostazione dell'intestazione) possono essere eseguite solo sullo stesso dominio dell'applicazione JavaScript,
Angular JS ti semplifica la vita
Fortunatamente, sto usando Angular JS nella nostra piattaforma e pacchetti angolari l'approccio token CSRF, rendendo più semplice l'implementazione per noi. Per ogni richiesta che la nostra applicazione angolare fa al server, il $http
servizio angolare farà queste cose automaticamente:
- Cerca un cookie chiamato XSRF-TOKEN sul dominio corrente.
- Se viene trovato quel cookie, legge il valore e lo aggiunge alla richiesta come intestazione X-XSRF-TOKEN.
Pertanto l'implementazione lato client viene gestita automaticamente per te! Dobbiamo solo impostare un cookie denominato XSRF-TOKEN
sul dominio corrente sul lato server e quando la nostra API ha ricevuto una chiamata dal client, deve controllare l' X-XSRF-TOKEN
intestazione e confrontarla con quella XSRF-TOKEN
nel JWT. Se corrispondono, l'utente è reale. Altrimenti, è una richiesta falsa e puoi ignorarla. Questo metodo è ispirato al metodo "Double Submit Cookie".
Attenzione
In realtà, sei ancora sensibile a XSS, è solo che l'aggressore non può rubarti il token JWT per un uso successivo, ma può comunque effettuare richieste per conto dei tuoi utenti utilizzando XSS.
Sia che memorizzi il tuo JWT nel localStorage
tuo token XSRF o non nel cookie HttpOnly, entrambi possono essere facilmente acquisiti da XSS. Anche il tuo JWT in un cookie HttpOnly può essere catturato da un attacco XSS avanzato come il metodo XST .
Quindi, oltre al metodo Double Submit Cookies, devi sempre seguire le migliori pratiche contro XSS, inclusi i contenuti di escape. Ciò significa rimuovere qualsiasi codice eseguibile che induca il browser a fare qualcosa che non si desidera. In genere questo significa rimuovere // <![CDATA[
tag e attributi HTML che causano la valutazione di JavaScript.
Leggi di più qui: