Posso generare un token CSRF a doppio cookie sul client con JavaScript?

8

Ci sono problemi con la creazione del token CSRF con JavaScript appena prima di inviare il modulo? Esempio:

var csrf_token = Math.random();

// Write csrf token to cookie.

// Add csrf token to the form being submitted.

// Submit form.

// Verify cookie csrf to form csrf on the server.

// When request is done; remove the cookie.

// Rinse and repeat.

Capisco che questo sia vulnerabile a XSS ma l'XSS potrebbe semplicemente inviare il modulo con valori personalizzati, quindi avere XSS è peggio.

    
posta unska 01.03.2017 - 10:04
fonte

1 risposta

4

Non consiglierei questo. Perché il token offra protezione, deve essere imprevedibile. Math.random() non è crittograficamente sicuro - non esiste alcuna garanzia che un utente malintenzionato non possa generare carichi di valori casuali, rilevare il modello e quindi dedurre valori precedenti e quindi trovare il valore del token segreto. Si chiama "cross domain Math.random() predizione" e puoi leggere ulteriori informazioni al riguardo qui e qui .

Penso (non sono sicuro, però) che i browser più moderni proteggano da questo in pratica, ma quello è un dettaglio di implementazione su cui non scommetterei la sicurezza della mia applicazione. In realtà, MDN mette in guardia contro it:

Math.random() does not provide cryptographically secure random numbers. Do not use them for anything related to security. Use the Web Crypto API instead, and more precisely the window.crypto.getRandomValues() method.

Quindi puoi passare a getRandomValues() ? Solo se stai bene con supporto browser 80% .

Prima di fare ciò, chiediti perché non puoi semplicemente generare il token sul server. Se vai comunque per l'approccio del cliente, evita almeno queste due insidie:

  • Assicurati che nessun token nel modulo e nessun token nel cookie non passi! Un ingenuo controllo di uguaglianza potrebbe consentire il passaggio, dal momento che entrambi sono una stringa vuota, ma ciò aprirebbe una vulnerabilità.
  • Non deve esserci alcun URL che carica una pagina e invia automaticamente un modulo, aggiungendo il token nel processo. Tale URL potrebbe essere abusato.
risposta data 01.03.2017 - 11:00
fonte

Leggi altre domande sui tag