Una JWT è utilizzabile come token CSRF?

14

Ho bisogno di un token CSRF, per una determinata applicazione che invia un modulo con POST . Idealmente, mi piacerebbe non effettuare una chiamata DB per ogni invio, per evitare la memorizzazione e il traffico DB & latenza. A tal fine il "Foglio di trucchi di prevenzione CSRF" di OWASP dice,

Overview

The Encrypted Token Pattern leverages an encryption, rather than comparison, method of Token-validation. After successful authentication, the server generates a unique Token comprised of the user's ID, a timestamp value and a nonce, using a unique key available only on the server. This Token is returned to the client and embedded in a hidden field. […] Non-AJAX form-based requests will implicitly persist the Token in its hidden field. On receipt of this request, the server reads and decrypts the Token value with the same key used to create the Token. […]

Validation

On successful Token-decryption, the server has access to parsed values, ideally in the form of claims.

La prima riga di "Validazione" mi sembra, come la definizione stessa di un JWT . Non vedo perché le informazioni in token debbano essere crittografate: sembrerebbe che debba semplicemente essere autenticato che proviene dal server (al contrario di un utente malintenzionato che tenta di creare un token CSRF).

C'è qualche ragione particolare per crittografare i token CSRF? In caso contrario, un JWT è sufficiente?

Inoltre, il modello di token di cui sopra include un nonce. Qual è il punto del nonce? (L'intero punto di questo schema è di non memorizzare alcun stato sul lato server. Se non sto memorizzando lo stato, come posso usare il nonce durante la convalida in qualsiasi modo materiale?)

Il motivo principale per cui inseguo i JWT qui è che c'è un supporto decente per le biblioteche, probabilmente li cercherò prima o dopo, e mi impedisce soprattutto di implementare la crittografia.

La mia comprensione delle JWT è che se avessi JWT per l'autenticazione completa dell'utente, potrei memorizzarli in localStorage e semplicemente aggiungerli a un campo con JS prima dell'invio del modulo. Sfortunatamente, l'app utilizza un'autenticazione basata su cookie e al momento non sono in grado di modificare l'aspetto.

    
posta Thanatos 25.02.2016 - 19:48
fonte

3 risposte

10

Non è necessario crittografare il token o includere il nonce. Le proprietà chiave di un token CSRF sono che non è prevedibile da un utente malintenzionato e, contrariamente ai cookie, non viene aggiunto a ogni richiesta dal browser. Un JWT crittograficamente sicuro memorizzato in un campo nascosto soddisfa entrambe queste proprietà.

Si noti che è necessario utilizzare JWT che contengono dati univoci dell'utente. Avere una JWT vuota o generica che non è specifica per l'utente non ti fornirà sicurezza.

    
risposta data 25.02.2016 - 20:41
fonte
18

TL; DR

Una JWT, se usata senza cookie, nega la necessità di un token CSRF - MA! memorizzando JWT in session / localStorage, esponi il tuo JWT e l'identità dell'utente se il tuo sito ha una vulnerabilità XSS (abbastanza comune). È meglio aggiungere una chiave csrfToken al JWT e memorizzare il JWT in un cookie con secure e http-only attributi set.

Leggi questo articolo con una buona descrizione per maggiori informazioni link

You can make this CSRF protection stateless by including a xsrfToken JWT claim:

{ "iss": "http://galaxies.com", "exp": 1300819380, "scopes": ["explorer", "solar-harvester", "seller"], "sub": "[email protected]", "xsrfToken": "d9b9714c-7ac0-42e0-8696-2dae95dbc33e" }

Quindi sarà necessario memorizzare csrfToken in local / sessionStorage così come all'interno del JWT (che è memorizzato in un cookie solo http e sicuro). Quindi, per la protezione csrf, verifica che il token csrf nel JWT corrisponda all'intestazione csrf-token presentata.

    
risposta data 11.05.2016 - 19:38
fonte
1

Potresti usare un JWT come token CSRF, ma sarebbe inutilmente complicato: un token CSRF non ha bisogno di contenere alcuna rivendicazione, né essere crittografato o firmato.

Probabilmente c'è un equivoco su cosa sono usati i token JWT o CSRF (anch'io ero confuso all'inizio). Il JWT è un token di accesso, utilizzato per l'autenticazione. Il token CSRF, d'altra parte, viene utilizzato per proteggere l'utente dall'essere ingannato nell'invio di una richiesta autenticata falsificata. Questo è necessario quando si utilizza una sessione o un'autenticazione di base HTTP o si memorizza il JWT in un cookie - qualsiasi autenticazione eseguita automaticamente dal browser.

Se disponi di un tale schema di autenticazione, assicurati di

  • usa i verbi HTTP appropriati (GET non deve avere effetti collaterali)
  • genera un nuovo token CSRF su ogni richiesta
  • include il token CSRF in un'intestazione o come parametro HTTP su ogni richiesta PATCH, POST, PUT e DELETE

Leggi, ad esempio, come Spring gestisce CSRF .

    
risposta data 02.04.2018 - 00:07
fonte

Leggi altre domande sui tag