2011-08-27 14 views
13

thể trùng lặp:
"CSRF token missing or incorrect" while post parameter via AJAX in DjangoJQuery + AJAX + Django = CSRF?

tôi muốn gửi dữ liệu đăng nhập bằng AJAX để xác thực người dùng, nhưng nó đã không thể thực hiện vì CSRF. Bạn có thể cho tôi biết cần thêm gì vào mã của tôi để làm cho nó hấp dẫn không?

tập tin JavaScript của tôi:

$("#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

Tôi tin rằng bạn có thể tìm thấy câu trả lời của mình [ở đây] (https://docs.djangoproject.com/en/dev/ref/contrib/csrf/). Giải pháp đơn giản nhất có vẻ là vô hiệu hóa tính năng bảo vệ CSRF trên thể hiện django. Tùy chọn tốt nhất tiếp theo là cập nhật thông tin đăng nhập JavaScript của bạn để lấy mã thông báo CSRF của django từ biểu mẫu và bao gồm nó như một phần của yêu cầu AJAX. – aroth

+1

Hãy xem câu trả lời trước của tôi. http://stackoverflow.com/questions/6506897/csrf-token-missing-or-incorrect-while-post-parameter-via-ajax-in-django/6533544#6533544 – sigurd

Trả lời

10

Có một method explained here.

Nó bao gồm thêm tiêu đề X-CSRFToken vào mỗi yêu cầu ajax.

Điều này được thực hiện bằng cách gắn vào sự kiện jQuery.ajaxSend, vì vậy mọi thứ được thực hiện tự động (bạn chỉ cần sao chép và dán mã của chúng và chạy nó một lần trước yêu cầu ajax đầu tiên bạn thực hiện).

+0

Vâng, tôi đã đọc nó. Nhưng, tôi không biết làm thế nào để sử dụng nó và nơi để thêm nó = /? –

+0

đặt mã ngay sau '' và đó là tất cả, có vẻ như. – arnaud576875

+0

Tôi đã đặt mã đó sau khi kết thúc của '$ (" # login "). (" Click ", function() {' function - nó không thay đổi gì cả: (Mã đó phải nằm trong tập tin riêng biệt? –

3

Tôi đã cố gắng giải quyết cùng một vấn đề, Và như arnaud576875 nói bạn phải Thêm tiêu đề mã thông báo csrf vào mỗi yêu cầu ajax giống như tài liệu Django nói https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax Và thực thi mã đó trước bất kỳ yêu cầu Ajax nào bạn thực hiện.

Nhưng có điều gì đó bổ sung, bạn phải tìm cách tải mã thông báo csrf vào cookie của ứng dụng trước khi thử thực hiện bất kỳ yêu cầu AJAX nào, sau rất nhiều giờ đau đớn nghiên cứu. về cách thực hiện điều này, điều tôi đã tìm thấy là để đảm bảo rằng chế độ xem của bạn gửi mã thông báo csrf trong cookie, bạn có thể sử dụng ensure_csrf_token() cho mỗi chế độ xem bạn muốn nhận mã thông báo https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#django.views.decorators.csrf.ensure_csrf_cookie điều này có vẻ phù hợp với nhiều người, nhưng đã không làm việc cho tôi.

Một cách khác là sử dụng Phương pháp kế thừa, thêm 'django.middleware.csrf.CsrfResponseMiddleware' vào số MIDDLEWARE_CLASSES của bạn nhưng tôi không đề xuất phương pháp này vì để lại một số rủi ro bảo mật. https://docs.djangoproject.com/en/1.2/ref/contrib/csrf/#legacy-method

Tất cả các phương pháp này mà tôi đã nói trước đây không hiệu quả đối với tôi. Cách mà tôi cho phép Ajax thực hiện một số yêu cầu là như sau và nếu ai đó tìm thấy phương thức nguy hiểm này, vui lòng cho tôi biết:

  1. Chuyển đến chế độ xem đầu tiên mà người dùng của bạn sẽ truy cập, như/trang chủ.
  2. Chèn này trước khi chuyển hướng hay phân tích bất cứ điều gì request.META["CSRF_COOKIE_USED"] = True

Và đó là nó, đó là cách làm việc cho tôi, nhưng như tôi đã nói trước tôi không chắc chắn nếu điều này là phương pháp đúng hay sự an toàn nhất một để thực hiện bảo vệ csrf.