2011-12-28 13 views

risposta

33

In generale, è sufficiente avere solo one token per session, un cosiddetto per sessione di token:

In generale, gli sviluppatori hanno bisogno solo di generare questo token una volta per la sessione corrente. Dopo la generazione iniziale di questo token, il valore viene memorizzato nella sessione e viene utilizzato per ogni richiesta successiva fino alla scadenza della sessione.

Se si vuole migliorare ulteriormente la sicurezza, è possibile utilizzare un gettone per ogni modulo/URL (per-forma di token) per mitigare l'impatto quando una perdita di token (e. G. XSS) come l'autore dell'attacco sarebbe in grado di attaccare correttamente quel modulo/URL specifico.

Ma utilizzando i token per richiesta, i. e. token che cambiano con ogni richiesta, piuttosto taglia l'usabilità del sito in quanto limita la navigazione parallela:

per migliorare ulteriormente la sicurezza di questo progetto proposto, in considerazione randomizzazione il token CSRF [...] per ogni richiesta. L'implementazione di questo approccio comporta la generazione di token per richiesta anziché token per sessione. Si noti, tuttavia, che ciò potrebbe causare problemi di usabilità. Ad esempio, la capacità del browser dei pulsanti "Indietro" è spesso ostacolata poiché la pagina precedente potrebbe contenere un token che non è più valido. L'interazione con questa pagina precedente comporterà un evento di sicurezza positivo falso CSRF sul server.

Quindi ti consiglio di utilizzare token per sessione o token per modulo.

+0

Penso che i token di moduli funzionerebbero se: ** a) ** Crei il token solo quando l'utente carica il modulo per la prima volta, eventuali carichi di moduli successivi devono riutilizzare il primo token per tale modulo. ** b) ** Quando si memorizza il token nella sessione, dovrebbe includere un identificatore per la pagina/modulo specifico. Per esempio. SESSION ['edit-user-csrf'] e SESSION ['edit-order-csrf'] e in questo modo è possibile aprire una pagina diversa in una scheda diversa e i due moduli possono ancora essere inviati correttamente mentre la sessione sta memorizzando entrambi token (uno per ogni forma). La pagina sa quale token csrf controllare e utilizzare perché si trova su quella pagina. – zuallauz

+0

Assicurarsi di disporre di tempi di sessione Inactivity e Absolute che richiedono la re-autenticazione e la generazione di nuovi token. (Esempio: 20 minuti di inattività o 4 ore assoluti) – LaJmOn

+0

@zuallauz L'URL del modulo può essere utilizzato per identificare il modulo. Se ciò non è sufficiente, puoi aggiungere qualsiasi altra informazione identificativa (ad es. Valori di input nascosti) o, ancora meglio, usare un [form container per memorizzare i valori di input nascosti in] (http://stackoverflow.com/a/9108483/53114) che impedirà anche lo spoofing dei valori di input nascosti] (http://stackoverflow.com/a/9209121/53114). – Gumbo

11

No, devi solo generate a token on a per-session basis.

È molto improbabile che i token vengano trapelati accidentalmente dagli utenti e generare un token per modulo rende le cose molto complicate se un utente naviga nel sito in due diverse schede/finestre contemporaneamente.

+0

Grazie. Quindi, il token sarà comunque posizionato in ogni forma (ma solo un token per sessione diverso)? – Centurion

+0

Sì, è vero. – Quentin