2011-08-27 79 views
13

可能重複:
"CSRF token missing or incorrect" while post parameter via AJAX in DjangoJQuery + AJAX + Django = CSRF?

我希望通過AJAX發送登錄數據進行驗證的用戶,但它是因爲CSRF的不可能的。你能告訴我要添加到我的代碼,以使其令人興奮嗎?

我的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

我相信你可以找到你的答案[這裏](https://docs.djangoproject.com/en/dev/ref/contrib/csrf/)。最簡單的解決方案似乎是在django實例上禁用CSRF保護。下一個最佳選擇是更新您的JavaScript登錄,以從表單中抓取django的CSRF令牌,並將其作爲AJAX請求的一部分包含在其中。 – aroth

+1

看看我以前的答案。 http://stackoverflow.com/questions/6506897/csrf-token-missing-or-incorrect-while-post-parameter-via-ajax-in-django/6533544#6533544 – sigurd

回答

10

有一個method explained here

它包括在每個ajax請求上添加X-CSRFToken標頭。

這是通過掛鉤jQuery.ajaxSend事件完成的,因此所有事情都是自動完成的(您只需複製並過去他們的代碼,然後在發出第一個ajax請求之前運行一次)。

+0

是的,我讀過它。但是,我不知道如何使用它以及在哪裏添加= /? –

+0

把代碼放在''後面,看起來就是這樣。 – arnaud576875

+0

我在$(「#login」)結束後放了這段代碼,live(「click」,function(){'function - 它沒有改變:(該代碼必須在單獨的文件中) –

3

我一直在試圖解決同樣的問題,並且正如arnaud576875所說的,您必須在每個ajax請求上添加csrf標記頭,就像Django文檔所說的https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax並在您發出任何Ajax請求之前執行該代碼。

但還有一些額外的,你必須找到一種方法,在試圖做任何AJAX請求之前,加載csrf標記到你的應用程序的cookie之前,經過很多痛苦的小時研究我找不到具體的答案如何做到這一點,我所發現的是,爲了確保您的視圖在cookie中發送csrf令牌,您可以使用ensure_csrf_token()到每個您想要接收令牌的視圖https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#django.views.decorators.csrf.ensure_csrf_cookie這似乎適用於很多人,但沒有爲我工作。

另一種方法是使用傳統方法,將'django.middleware.csrf.CsrfResponseMiddleware'添加到您的MIDDLEWARE_CLASSES,但我不推薦此方法,因爲存在一些安全風險。 https://docs.djangoproject.com/en/1.2/ref/contrib/csrf/#legacy-method

我之前說過的所有這些方法都不適合我。我允許Ajax做一些請求的方式如下,如果有人發現這是一個危險的方法,請讓我知道:

  1. 轉到第一個視圖,您的用戶將命中,如/主頁。
  2. 重定向或分析任何 request.META["CSRF_COOKIE_USED"] = True

前插入這個就是這樣,這就是我的工作方式,但正如我所說,我以前不知道這是正確的方法還是最安全的一個來完成csrf保護。