Sto costruendo SPA (React / Redux) e ho bisogno dell'autenticazione dell'utente. Ho trovato discussioni simili, ma non ho trovato risposte alle domande che ho delineato di seguito. Ecco alcune opzioni che ho trovato per implementare:
Opzione 1: mantiene JWT in localStorage
Attacco CSRF : non vulnerabile, poiché i cookie non vengono utilizzati.
Attacco XSS : vulnerabile. Qualsiasi codice JS nel front-end sarà in grado di rubare il token e inviarlo all'attaccante. Con Content-Security-Policy abilitato, attaccato non può rubare / inviare a se stesso jwt, ma può comunque effettuare richieste direttamente dal browser client.
Opzione 2: mantiene JWT in cookie ( secure
e http-only
)
Attacco CSRF : vulnerabile. Il cliente può seguire il sito Web dannoso, che farà richiesta subdola, cookie allegato, requst riuscito.
Attacco XSS : vulnerabile. I cookie non possono essere letti da JS, ma tramite JS attacker è sufficiente effettuare richieste di back-end validi, i cookie vengono automaticamente allegati e tutte le richieste avranno esito positivo.
Opzione 3: mantenere JWT (con xsrf_token set) nel cookie + mantenere xsrf_token nel cookie LocalStorage / JS-leggibile
La soluzione è basata su questo e simile a Double Submit Cookies Method
Attacco CSRF : non vulnerabile. Se il client segue il sito Web dannoso, il che rende subdola la richiesta, tale richiesta verrà eliminata, poiché xsrf_token non è stato trasmesso dal browser del client insieme al cookie. E poiché il cookie non è visibile all'attaccante (viene fornito direttamente dal browser client), non può rendere falso xsrf_token da allegare alla richiesta.
Attacco XSS : vulnerabile. xsrf_token nel cookie localStorage / JS-leggibile può essere letto dagli hacker JS. Quindi, un utente malintenzionato sarà in grado di effettuare richieste maligne direttamente dal suo JS iniettato dal browser dei client.
Inizialmente, volevo usare l'opzione 1. Ma ero interessato all'XSS, quindi ho iniziato a cercare alternative. Questo articolo e numero di altri sconsiglia di localStorage e consiglia di utilizzare la protezione di Cookie + CSRF.
L'opzione 3 sembra la soluzione popolare, dai dati raccolti, ma ha ancora l'XSS come l'opzione 1 - JS iniettato può effettuare richieste maligne direttamente dal browser client. L'unico vantaggio è che nell'opzione 1 i dati codificati JWT sono leggibili dall'utente / utente malintenzionato, mentre nell'opzione 3 non lo è (come memorizzato nel cookie). domanda correlata
Q1. Ci sono altri vantaggi dell'opzione 3 rispetto all'opzione 1?
Q2. Se vado con l'Opzione 3, sto introducendo alcuni altri vettori di attacco, che non ho ancora considerato?
Q3. Esiste un altro modo per mitigare CSRF, invece di mantenere lo stato in front-end (localStorage / sessionStorage / Redux store / JS-readable cookie) che è sempre vulnerabile a XSS?
So che non c'è nessun proiettile magico in sicurezza. Ma forse ci sono altri approcci / opzioni a questo problema? Per rimuovere XSS, devi andare in modalità cookie completa. Ma per andare solo ai cookie, è necessario avere comunque xsrf_token nel front-end dell'utente (localStorage / sessionStorage / Redux store / cookie leggibile da JS), che è vulnerabile all'XSS. Sembra un problema di catch-22.