2011-08-27 3 views
13

Eventuali duplicati:
"CSRF token missing or incorrect" while post parameter via AJAX in DjangoJQuery + AJAX + Django = CSRF?

ho voluto inviare dati di login per AJAX per l'autenticazione degli utenti, ma non è stato possibile a causa di CSRF. Potresti dirmi cosa aggiungere al mio codice per farlo svegliare?

mio file JavaScript:

$("#login").live("click", function() { 
    var username = $(".login_username").val(); 
    var password = $(".login_password").val(); 

    $.ajax({ 
     url: "/login", 
     type: "POST", 
     data: { 
      username: username, 
      password: password 
     }, 
     cache: false, 
     success: function(tekst) { 
      alert(tekst); 
     } 
    }); 
}); 
+0

credo che si può trovare la risposta [qui] (https://docs.djangoproject.com/en/dev/ref/contrib/csrf/). La soluzione più semplice sembra disabilitare la protezione CSRF sull'istanza di django. La prossima opzione migliore è aggiornare il tuo login JavaScript per prelevare il token CSRF di django dal modulo e includerlo come parte della richiesta AJAX. – aroth

+1

Date un'occhiata alla mia risposta precedente. http://stackoverflow.com/questions/6506897/csrf-token-missing-or-incorrect-while-post-parameter-via-ajax-in-django/6533544#6533544 – sigurd

risposta

10

C'è una method explained here.

Consiste nell'aggiungere un'intestazione X-CSRFToken su ogni richiesta Ajax.

Questo viene eseguito agganciando l'evento jQuery.ajaxSend, quindi tutto viene eseguito automaticamente (è sufficiente copiare e incollare il codice ed eseguirlo una volta prima della prima richiesta ajax effettuata).

+0

Sì, ho letto. Ma, non so come usarlo e dove aggiungerlo = /? –

+0

mettere il codice subito dopo '' e questo è tutto, a quanto pare. – arnaud576875

+0

Ho messo quel codice dopo la fine di '$ (" # login "). Live (" click ", function() {' function - non ha cambiato nulla :(. Questo codice deve essere in un file separato? –

3

Ho cercato di risolvere lo stesso problema, e come arnaud576875 dice che devi aggiungere l'intestazione del token csrf su ogni richiesta Ajax proprio come i documenti Django dice https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax ed eseguire quel codice prima di qualsiasi richiesta Ajax che fai.

Ma c'è qualcosa di aggiuntivo, devi trovare un modo per caricare il token csrf sui cookie della tua app prima di provare a fare qualsiasi richiesta AJAX, dopo molte ore dolorose di ricerca non sono riuscito a trovare una risposta specifica di come fare questo, quello che ho trovato è che per garantire che la tua vista mandi il token csrf all'interno di un cookie puoi usare lo ensure_csrf_token() per ogni vista che vuoi ricevere il token https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#django.views.decorators.csrf.ensure_csrf_cookie questo sembra funzionare per molte persone, ma non ha funzionato per me

Un altro modo è utilizzare il metodo legacy, aggiungendo il 'django.middleware.csrf.CsrfResponseMiddleware' al numero MIDDLEWARE_CLASSES ma non è consigliabile questo metodo in quanto comporta diversi rischi per la sicurezza. https://docs.djangoproject.com/en/1.2/ref/contrib/csrf/#legacy-method

Tutti questi metodi che ho detto prima non hanno funzionato per me. Il modo in cui sto permettendo Ajax per fare alcune richieste è come il seguente, e se qualcuno trova questo un metodo pericoloso per favore fatemelo sapere:

  1. Vai alla prima vista che l'utente colpirà, come il/casa/pagina.
  2. inserire questo prima di reindirizzare o parsing nulla request.META["CSRF_COOKIE_USED"] = True

E questo è tutto, Questo è il modo che funziona per me, ma come ho detto prima non sono sicuro se questo è il metodo giusto o il più sicuro uno per realizzare la protezione CSRF.