Django csrf ajax仅在生产时失败

时间:2015-10-07 13:40:27

标签: ajax django csrf

据我所知,我已将所有内容都设置正确,并且它在开发中有效:

我已经包含以下代码:

function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie != '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = jQuery.trim(cookies[i]);
            // Does this cookie string begin with the name we want?
            if (cookie.substring(0, name.length + 1) == (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}
var csrftoken = getCookie('csrftoken');

function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
    beforeSend: function(xhr, settings) {
        if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
    }
});

这可能是因为它可以用于开发而不是用于生产?

2 个答案:

答案 0 :(得分:1)

一个可能的原因可能是您的生产设置中有CSRF_COOKIE_SECURE = True。这将仅使用HTTPS连接发送cookie。如果您已启用此功能,但希望视图处理没有CSRF令牌的POST请求,请使用csrf_exempt修饰视图。

编辑:同时检查是否启用了SESSION_COOKIE_SECURE。如果设置为True,则可能会遇到此问题。

我遇到了类似的问题并通过移动用户登录用户的网址(Django管理页面)来解决这个问题,只能通过HTTPS提供服务,从而无需后一种设置。我仍然保持CSRF_COOKIE_SECURE = True和处理POST请求所需的单个URL(set_language)包含@csrf_exempt,以便它可以绕过此设置。这意味着任何需要处理匿名会话表单的视图也需要进行类似的装饰。

现在一切似乎都运行良好,但我仍在进行研究,看看我的配置是否还有其他安全隐患。此外,可能有更好的方法来处理这个问题。在那之前,我可以忍受这种方法。 HTH。

答案 1 :(得分:0)

在我的情况下,以下问题解决了这个问题:

@ensure_csrf_cookie
def your_view(request)

根据文档,如果没有包含{%csrf_token%}的表单,则可能无法设置csrf cookie。

https://docs.djangoproject.com/en/1.10/ref/csrf/#django.views.decorators.csrf.ensure_csrf_cookie