2011-09-15 14 views
11

Ho appena installato una semplice protezione CSRF nella mia applicazione. Crea una briciola unica che viene convalidata rispetto al valore di una sessione al momento dell'invio di un modulo.Token CSRF: come implementare correttamente?

Purtroppo questo significa ora che non riesco a tenere aperte più istanze (schede nel browser) della mia applicazione contemporaneamente mentre i frammenti di CSRF si scontrano l'uno con l'altro.

Devo creare un singolo token per ogni modulo effettivo o utilizzare una briciola condivisa e condivisa per tutte le mie forme? Quali sono i buonsenso qui?

risposta

5

Si può fare entrambi. Dipende dal livello di sicurezza che vuoi.

L'API OWASP Enterprise Security (ESAPI) utilizza il metodo di sessione per singolo token per utente. Questo è probabilmente un metodo piuttosto efficace presumendo che non vi siano fori XSS e che si abbiano timeout di sessione ragionevolmente brevi. Se consenti alle sessioni di rimanere in vita per giorni o settimane, allora questo non è un buon approccio.

Personalmente, non trovo difficile utilizzare un diverso token per ogni istanza di ogni modulo. Memorizzo una struttura nella sessione dell'utente con coppie chiave-valore. La chiave per ogni articolo è l'ID del modulo, il valore è un'altra struttura che contiene il token e una data di scadenza per quel token. Solitamente permetto a un token di vivere per 10-20 minuti, quindi scade. Per i moduli più lunghi posso dargli un lungo periodo di scadenza.

Se si desidera essere in grado di supportare lo stesso modulo in più schede del browser nella stessa sessione, il mio metodo diventa un po 'complicato, ma potrebbe comunque essere facilmente realizzato con ID di modulo univoci.

+0

Intendi dire che ogni istanza di ogni modulo ha il proprio token? Vale a dire. ''? – Industrial

+4

Penso che avere un singolo token per sessione sia ragionevole finché non li si invia tramite http (solo https). Condividono molti problemi di sicurezza con gli ID di sessione. Se si dispone di XSS, l'attaccante può aprire iframe, leggere i token e fare CSRF comunque. – Erlend

+0

Se hai XSS, hai già perso. Ulteriori formazioni per form non ti salveranno (l'attaccante sarà in grado di ottenere un nuovo modulo, con nuovo nonce, riempirlo e inviarlo, proprio come farebbe l'utente). Un singolo valore per utente è assolutamente sufficiente per CSRF. – Kornel

1

Prima di tutto: non sono un esperto di sicurezza, quindi probabilmente non dovresti fidarti di quello che dico.

Penso che generare un token diverso per ogni modulo sia più sicuro. Considerare una vulnerabilità XSS su una pagina che consente all'autore dell'attacco di ottenere il token CSRF per tale modulo. Se tutti i moduli utilizzano lo stesso token, l'utente malintenzionato ora ha i token CSRF per tutte le forme. Se tutte le forme hanno diversi token, l'attacco potrebbe essere di dimensioni molto inferiori.

+3

Spiacente, ma se si dispone di XSS, l'utente malintenzionato può semplicemente aprire iframe nei moduli dati e leggere i token da essi. Se si dispone di XSS, l'approccio token ha esito negativo e lo stesso vale per l'approccio doppio del cookie di invio per evitare XSS. – Erlend

-3

Come so di CSRF, è possibile utilizzare

1) il numero a caso e salvarlo in sessione:
aggiungerlo a ingresso nascosto chiamato nascosto, poi quando si recive informazioni è possibile controllare campo nascosto con il valore di sessione

2) variabile di configurazione statico (come precedente, ma nessuna sessione)
il campo nascosto conterrà questo valore (variabile da config). Quando si convalida, si verificherà il nascosto distaccato e il valore della chiave di sicurezza di configurazione

3) referer
È possibile utilizzare referer sapere dove l'utente venire da quindi controllare con il vero dominio (questo metodo può attacca se il tuo sito web contiene xss).

Come So che è possibile utilizzare qualsiasi soluzione :)

+1

Il tuo secondo esempio; Come puoi suggerire di usare una variabile statica come un token CSRF? L'idea alla base dei token è la loro unicità, nel senso che nessuno dovrebbe essere in grado di indovinare in anticipo quale sarebbe il token. Come diavolo renderebbe questa forma più sicura? – Industrial

+1

2 non funziona, in quanto la chiave non è individuale per utente. 3 non è consigliato in quanto molti firewall aziendali eliminano l'intestazione del referer ed è davvero irraggiungibile. – Erlend

+0

HTTP Referer non è un modo sicuro per sconfiggere CSRF. (Nemmeno una variabile statica.) –

4

Il OWASP Cheat Sheet ha le risposte più definitive per questo genere di cose. Discute i diversi approcci e il bilanciamento tra sicurezza e usabilità.

In breve, si consiglia di disporre di un singolo token per sessione (browser). In altre parole nel tuo caso lo stesso token è condiviso tra le schede. Il cheat sheet sottolinea anche che è molto importante non esporre il tuo sito a vulnerabilità cross-site scripting, poiché questo sovverte la strategia del token CSRF per sessione.