2015-08-26 20 views
9

Il mio sito Web ha una vista AJAX POST che può essere richiamata da qualsiasi pagina sull'app (tracciamento eventi). Questa vista è protetta da CSRF. In alcuni casi, il cookie CSRF non è impostato e la chiamata POST fallisce.Django: Forzatura del token CSRF su tutte le risposte

Invece di decorare manualmente tutte le viste con @ensure_csrf_cookie, sto pensando di scrivere ho creato un middleware che impone Django per impostare il cookie CSRF su tutte le risposte. Questo approccio è corretto? Non crea un difetto di sicurezza di cui non sono a conoscenza?

Aggiornamento: Ecco il codice middleware:

from django.middleware.csrf import get_token 

class ForceCsrfCookieMiddleware(object): 
    def process_request(self, request): 
     get_token(request) 
+1

sicurezza difetto? Penso di no. Perché stai semplicemente implementando la funzionalità di 'ensure_csrf_cookie' in un middleware. Anche se, leggi il codice sorgente di quel decoratore. – xyres

risposta

1

No, non c'è nessun problema finché non si è rendere il token CSRF all'interno di un modulo che i messaggi a un sito esterno (ma che sarebbe comunque un problema, non importa dove lo si implementa). È possibile impostarlo su un middleware, su alcune viste o su tutte le viste, non importa.

La protezione CSRF viene eseguita solo per garantire che la richiesta provenga dal tuo sito. Non importa quanto spesso tu imposti il ​​cookie, se la richiesta include il token CSRF corretto significa che la richiesta proviene effettivamente dal tuo sito, perché solo il tuo sito può accedere ai tuoi cookie. (Naturalmente questo vale solo se non si è che perde il token CSRF a terzi, ad esempio con l'invio ad altri siti)

In poche parole, questo è come funziona:

  1. I set di server un cookie con un valore casuale nella risposta
  2. Il tuo sito legge quel valore e lo invia al server durante la pubblicazione dei dati
  3. Poiché i cookie sono accessibili solo dallo stesso dominio che li ha impostati, non c'è modo per un altro sito per leggere quel cookie Pertanto, ogni volta che ricevi una richiesta con il token csrf corretto, sei sicuro che quella richiesta provenga dal tuo sito.

Per una buona spiegazione di CSRF, date un'occhiata a questo articolo: http://www.gnucitizen.org/blog/csrf-demystified/