jQuery + AJAX + Django = CSRF ? [复制]

Posted

技术标签:

【中文标题】jQuery + AJAX + Django = CSRF ? [复制]【英文标题】:JQuery + AJAX + Django = CSRF ? [duplicate] 【发布时间】:2011-11-05 02:34:04 【问题描述】:

可能重复:"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);
        
    );
);

【问题讨论】:

相信你能找到答案here。最简单的解决方案似乎是在 django 实例上禁用 CSRF 保护。下一个最佳选择是更新您的 JavaScript 登录以从表单中获取 django 的 CSRF 令牌并将其作为 AJAX 请求的一部分。 看看我之前的回答。 ***.com/questions/6506897/… 【参考方案1】:

有一个method explained here。

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

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

【讨论】:

是的,我已经读过了。但是,我不知道如何使用它以及在哪里添加它=/? 将代码放在<script src=".../jquery.js"></script> 之后,似乎就是这样。 我已将该代码放在 $("#login").live("click", function() function 的结尾之后 - 它没有任何改变 :(。该代码必须在单独的文件中? 不知道如何......但它开始正常工作:P. 链接断开。试试this one instead【参考方案2】:

我一直在尝试解决同样的问题,正如 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 执行某些请求的方式如下,如果有人发现这是一种危险的方法,请告诉我:

    转到用户将点击的第一个视图,例如 /home/ 页面。 在重定向或解析任何内容之前插入此 request.META["CSRF_COOKIE_USED"] = True

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

【讨论】:

以上是关于jQuery + AJAX + Django = CSRF ? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

django、ajax、jquery

无法将 jquery/ajax 集成到 django 项目中

如何在 Django 中使用 jQuery/Ajax 发布?

Django + ajax(jquery):http错误代码403(禁止)[关闭]

django + jQuery AJAX初试

Django - 没有 JQuery 库的 Ajax