JQuery + AJAX + Django = CSRF?

时间:2011-08-27 13:40:08

标签: javascript ajax django csrf-protection

  

可能重复:
  "CSRF token missing or incorrect" while post parameter via AJAX in Django

我想通过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);
        }
    });
});

2 个答案:

答案 0 :(得分:10)

有一个method explained here

它包括在每个ajax请求上添加一个X-CSRFToken标头。

这是通过挂钩jQuery.ajaxSend事件来完成的,所以一切都是自动完成的(你只需要复制并经过他们的代码,并在你发出第一个ajax请求之前运行一次)。

答案 1 :(得分: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. 转到您的用户将会点击的第一个视图,例如/ home / page。
  2. 在重定向或解析任何内容 request.META["CSRF_COOKIE_USED"] = True
  3. 之前插入此内容

    就是这样,这就是对我有用的方式,但正如我之前所说,我不确定这是否是正确的方法或最安全的方法来完成csrf保护。