2012-11-16 12 views
11

Jestem testowania, aby żądania POST ajaxdjango nie csrftoken w pliku cookie

Mam 403 z powodu braku csrftoken

śledziłem dokument, jeszcze nie działać.

znalazłem plik cookie o nazwie csrftoken jest pusty

to znaczy $ .cookie ("csrftoken") zwróci null

może ktoś mi powiedzieć powód !!

jak ustawić csrftoken na cookie

THX !!

+0

Miał podobny problem wcześniej, miał do czynienia z dekoratorem csrf_protect.Jeśli publikujesz ze strony do innego adresu URL (ajax dla przykładu) i jeśli korzystasz z dekoratora @csrf_protect itp upewnij się, że zarówno widok, który publikujesz dane z i adres URL otrzymujący dane pocztowe do tego dekoratora. – sidarcy

+1

Twój widok, twój formularz szablonu? –

Odpowiedz

15

Myślę, że powinieneś podać kod, jak uzyskać token csrf w kodzie HTML/JS i ustawienia dla middleware. Najpierw sprawdź, czy django.middleware.csrf.CsrfViewMiddleware jest włączony.

Miałem podobny problem, gdy w kodzie Pythona użyłem request.META.get('CSRF_COOKIE'), aby uzyskać token.

Gdy używasz tego tokena w szablonie - {% csrf_token %} Django zauważa, że ​​token został wyrenderowany i ustawia plik Cookie w CsrfViewMiddleware.process_response. Jeśli otrzymasz wartość tokena w inny sposób, Django przegapi tę flagę. Tak więc wygeneruje token, ale nie ustawi odpowiedniego pliku cookie.

Mam 2 obejścia w kodzie. Powinieneś dodać go do swoich widoków, które są używane do generowania szablonów z kodem JS.

1. Można wymusić Django ustawić CSRF cookie:

# Force updating CSRF cookie 
request.META["CSRF_COOKIE_USED"] = True 

2. Django automatycznie ustawia CSRF_COOKIE_USED jeśli zadzwonisz get_token

from django.middleware.csrf import get_token 
# don't use direct access to request.META.get('CSRF_COOKIE') 
# in this case django will NOT send a CSRF cookie. Use get_token function 
csrf_token = get_token(request) 

Każde z tych rozwiązań powinien działać osobno. Radzę użyć get_token

+0

Bardzo mi przykro, zapomniałem tego. Dziękuję za Twoją odpowiedź. –

13

Prawdopodobnie chcesz użyć dekoratora widoku ensure_csrf_cookie (dostępnego od wersji 1.4 Django). Spowoduje to ustawienie pliku cookie csrftoken, nawet jeśli nie używasz znacznika szablonu {{ csrf_token }}.

+1

Ta metoda działa dobrze dla mnie! – Max

3

Miałem ten sam problem ($ .cookie ("csrftoken") zwróciło "niezdefiniowane").

Problem był w mojej konfiguracji Django, ja skomentował następujący wiersz, a to działa:

#CSRF_COOKIE_HTTPONLY = True # Prevent client-side JavaScript access to the CSRF cookie 
+0

Tak, plik cookie typu "http" nie może uzyskać dostępu przez javascript podczas przeglądania. –

2

Rozszerzając o_c's answer: przez komentowania linię CSRF_COOKIE_HTTPONLY wartość csrf_token nie jest już „nieokreślone” (Firefox Firebug) i jest pokazywana jako "rzeczywista" wartość, np "qGuPe2Q7 ... itd.".

Żądanie ajaxowe nie jest już odrzucane z błędem 403 Forbidden i jest poprawnie wykonywane (pod warunkiem, że csrf_token jest ustawiony w nagłówku AJAX).

 $.ajaxSetup({ 
      beforeSend: function(xhr, settings) { 
       if (!csrfSafeMethod(settings.type) && !this.crossDomain) { 
       xhr.setRequestHeader("X-CSRFToken", csrftoken); 
       } 
      } 
     }); 
1

Przede wszystkim, jeśli projektowania aplikacji, to zawsze lepiej użyć csrf Reklamowe w nagłówku lub w żądaniu POST zamiast w pliku cookie, ponieważ:

  • Wszystkie formularze muszą dynamicznie dodawaj wartość do swojego HTML. Każdy wpis POST AJAX również musi zawierać wartość.
  • Plik cookie zostanie przesłany na każde żądanie (tj. Wszystkie GET dla obrazów , CSS, JS itp., Które nie są zaangażowane w proces CSRF). zwiększenie rozmiaru żądania.

Jeśli chcesz wymusić korzystanie z plików cookie w Django, można zawsze:

request.META["CSRF_COOKIE_USED"] = True 

w projekcie, jeśli nie używasz {% csrf_token%} w dowolnym miejscu. Zgodnie z [dokumentacją] [1], nie musisz wykonywać żadnych innych czynności, ale napisz prosty kod javascript. Właściwie to nie jest prawda. W każdym widoku musisz umieścić linię "request.META['CSRF_COOKIE_USED'] = True" (lub napisać odpowiedni dekorator).

Powiązane problemy