Ci sono un sacco di articoli che spiegano cos'è CSRF e che dovrei usare un token CSRF per prevenire CSRF. Alcuni di loro menzionano dettagli come l'utilizzo di SHA256 su MD5. Tuttavia, nessuno di essi spiega come implementare la protezione CSRF in relazione al flusso dell'utente. Ad esempio, suppongo di memorizzare il token CSRF in un database o può essere autonomo? Ecco come penso che implementerò la protezione CSRF, fammi sapere se c'è qualcosa di sbagliato:
-
L'utente arriva alla pagina e accede. Ricevono un cookie http-only contenente un JWT.
-
Genero un valore casuale di 128-512 bit (lunghezza fissa, deciderò quanto è lungo). Quindi, concatro il valore e l'ID utente e HMAC SHA256 cancellano il risultato con una chiave privata. Inserisco sia il valore casuale che l'hash nel codice HTML.
-
Ogni volta che l'utente effettua una richiesta API, il valore casuale e l'hash vengono aggiunti come un'intestazione, una variabile GET o una variabile POST (non c'è differenza per la sicurezza vero?).
-
Il server concatena il valore dato con l'ID dell'utente e lo confronta con l'hash specificato. Se corrispondono, la parte CSRF è terminata.
Questa implementazione è corretta? Alcuni motivi di preoccupazione sono che l'utente riceve un nuovo token CSRF ogni volta che esegue il caricamento di una pagina intera. Possono anche avere più token validi se hanno più schede aperte. Non penso che questi causeranno problemi però.
Modifica Un giorno intero di lettura di CSRF in seguito, mi sono reso conto che posso semplicemente inserire il JWT nell'intestazione della richiesta API e basta.