14

可能重复:
在 Django 中通过 AJAX 发布参数时出现“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);
        }
    });
});
4

2 回答 2

11

这里有一种方法解释

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

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

于 2011-08-27T13:44:28.687 回答
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/ 页面。
  2. 在重定向或解析任何内容之前插入它 request.META["CSRF_COOKIE_USED"] = True

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

于 2011-08-28T00:09:36.523 回答