2011-08-27 78 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保护。