2012-11-16 20 views
11

Tôi đang thử nghiệm để thực hiện một yêu cầu POST ajaxdjango không csrftoken trong cookie

tôi nhận được một 403 vì không có csrftoken

Tôi làm theo các tài liệu, nó vẫn không hoạt động.

tôi thấy cookie tên csrftoken là trống

đó có nghĩa là $ .cookie ("csrftoken") trả về null

ai đó có thể cho tôi biết lý do !!

cách đặt csrftoken thành cookie

THX !!

+0

Đã xảy ra sự cố tương tự trước đây, liên quan đến trình trang trí csrf_protect.Nếu bạn đăng từ trang này đến url khác (ajax cho Ví dụ) và Nếu bạn đang sử dụng @csrf_protect decorator, hãy đảm bảo cả chế độ xem bạn đang đăng dữ liệu từ và url nhận dữ liệu bài đăng để có trình trang trí này. – sidarcy

+1

chế độ xem của bạn, mẫu biểu mẫu của bạn? –

Trả lời

15

Tôi nghĩ bạn nên cung cấp mã cách bạn nhận mã thông báo csrf trong mã HTML/JS và cài đặt cho phần giữa của bạn.

Trước hết, bạn nên kiểm tra xem django.middleware.csrf.CsrfViewMiddleware có được bật hay không.

Tôi gặp sự cố tương tự, khi ở mã python tôi đã sử dụng request.META.get('CSRF_COOKIE') để nhận mã thông báo.

Khi bạn sử dụng mã thông báo này trong mẫu - {% csrf_token %} Django lưu ý rằng mã thông báo được hiển thị và đặt Cookie theo số CsrfViewMiddleware.process_response. Nếu bạn nhận được giá trị mã thông báo theo cách khác, Django sẽ bỏ lỡ lá cờ này. Vì vậy, nó sẽ tạo cho bạn một mã thông báo nhưng sẽ không đặt cookie tương ứng.

Tôi có 2 cách giải quyết trong mã. Bạn nên thêm nó vào các khung nhìn của bạn được sử dụng để tạo các khuôn mẫu với mã JS.

1. Bạn có thể buộc Django để thiết lập CSRF Cookie:

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

2. Django đặt CSRF_COOKIE_USED tự động nếu bạn gọi 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) 

Mỗi một trong những giải pháp này nên hoạt động riêng. Tôi khuyên bạn nên sử dụng get_token

+0

Tôi thực sự xin lỗi, tôi quên điều này. Cảm ơn bạn vì câu trả lời. –

13

Bạn có thể muốn sử dụng trình trang trí chế độ xem ensure_csrf_cookie (có sẵn kể từ Django 1.4). Điều này sẽ đặt cookie csrftoken ngay cả khi bạn không sử dụng thẻ mẫu {{ csrf_token }}.

+1

Phương pháp này hiệu quả với tôi! – Max

3

Tôi đã gặp sự cố tương tự ($ .cookie ('csrftoken') trả về 'không xác định').

Vấn đề là trong cấu hình Django của tôi, tôi nhận xét dòng sau và nó hoạt động:

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

Vâng, Cookie chỉ http không thể truy cập bằng javascript trong một trình duyệt. –

2

Mở rộng trên o_c's answer: bằng cách bình luận dòng CSRF_COOKIE_HTTPONLY, giá trị csrf_token không còn 'undefined' (trong Firefox firebug) và được hiển thị dưới dạng giá trị 'thực', ví dụ: 'qGuPe2Q7 ... vv'.

Yêu cầu Ajax không còn bị từ chối với lỗi 403 Forbidden và được thực hiện đúng (miễn là csrf_token được đặt trong tiêu đề AJAX).

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

Trước hết, nếu bạn đang thiết kế các ứng dụng, nó luôn luôn là tốt hơn để sử dụng CSRF token trong một tiêu đề hoặc trong yêu cầu POST chứ không phải trong một cookie, bởi vì:

  • Tất cả các hình thức phải có giá trị được thêm vào HTML động của nó. Bất kỳ POST nào của AJAX cũng phải bao gồm giá trị.
  • Cookie sẽ được gửi cho mọi yêu cầu (nghĩa là tất cả GET cho hình ảnh, CSS, JS, v.v. không tham gia vào quá trình CSRF) tăng kích thước yêu cầu.

Nếu bạn muốn ép buộc sử dụng cookie trong django, bạn có thể luôn:

request.META["CSRF_COOKIE_USED"] = True 

trong dự án của bạn nếu bạn không sử dụng {% csrf_token%} bất cứ nơi nào. Theo [tài liệu] [1], bạn không bắt buộc phải làm bất cứ điều gì khác, nhưng viết một mã javascript đơn giản. Thực ra nó không đúng. Bạn phải đặt "request.META['CSRF_COOKIE_USED'] = True" dòng trong mỗi chế độ xem (hoặc viết trang trí phù hợp).

Các vấn đề liên quan