Protezione Ajax e CSRF

7

Senza entrare troppo nei dettagli, ho un sito che è al 100% Ajax. Tutte le richieste al sito (sia GET che POST) vengono eseguite tramite Ajax. Ora devo implementare la protezione CSRF e tutte le soluzioni che ho trovato si riducono all'invio di un token CSRF nelle intestazioni, ma la maggior parte ottiene questo token da HTML o da un cookie fornito con la richiesta GET.

Ora il mio sito è al 100% Ajax e non viene ricaricato. Mi chiedo se potrei, prima di ogni richiesta POST, effettuare una richiesta GET al server per ottenere token e quindi inviarlo nelle intestazioni insieme alla richiesta POST, ad esempio

Invia GET request a aaa.com/get-csrf-token per ottenere il token e quindi invia quel token insieme alla richiesta nelle intestazioni, se qualcuno da un altro sito effettua una richiesta GET a aaa.com/get-csrf-token e il server restituisce un token, quindi fino a come so che non sono ancora in grado di leggere quel valore.

Poiché il token viene generato per sessione, posso semplicemente verificare che il token inviato sia lo stesso token che ho nel memchache associato a quella sessione.

Qualcuno potrebbe dirmi se questo funzionerebbe?

    
posta Dave 16.09.2012 - 05:08
fonte

2 risposte

5

Sì, puoi farlo. Questo dovrebbe andare bene È una difesa ragionevole contro CSRF.

Assicurati che le azioni con effetti collaterali possano avvenire solo tramite i POST (mai tramite GET) e che tutti i POST controllino la presenza del token. Inoltre, assicurati di generare il token come numero pseudocasuale crittograficamente strong (ad esempio, utilizzando CryptGenRandom() , /dev/urandom , SecureRandom o simile) e memorizzalo nello stato sessione.

Non so se questo abbia qualche vantaggio rispetto, ad esempio, all'invio doppio di cookie - ma potresti farlo, e dovrebbe proteggere con successo contro CSRF.

    
risposta data 16.09.2012 - 05:38
fonte
2

In realtà, due richieste per ogni attività rappresentano un sovraccarico delle prestazioni. Puoi semplicemente raggiungere questo risultato usando una singola richiesta. È possibile semplicemente convalidare il token durante la richiesta POST e inviare nuovamente il nuovo token ad ogni richiesta. Usando JS assicurati di prendere il valore del cookie più recente e allegarlo ad ogni richiesta inviata da AJAX.

Infatti, se vuoi ridurre il tuo dolore nella protezione CSRF della tua applicazione web, puoi vedere OWASP CSRF Protector Project , (disponibile solo per php al momento), fa tutto il necessario per mitigare CSRF e funziona bene con AJAX (sia XHR che activeXObject )

    
risposta data 17.07.2014 - 08:56
fonte

Leggi altre domande sui tag