未为某些用户设置django CSRF令牌cookie

时间:2019-08-19 09:44:54

标签: django csrf django-csrf

在大多数运行正常的应用程序中,我一直遇到零星的CSRF错误。我应该做的所有事情:我在模板中使用{% csrf_token %}来生成普通格式,在我的ajax POST中,我设置了X-CSRFToken头:

$.ajaxSetup({
    beforeSend: function(xhr, settings) {
        xhr.setRequestHeader("X-CSRFToken", $.cookie('csrftoken'));
    },
});

我甚至通过编写调用get_token的自定义中间件来强制在所有视图中设置cookie。

def CSRFForceCookieMiddleware(get_response):
    def middleware(request):
        response = get_response(request)
        get_token(request) # Force to set cookie in all responses
        return response
    return middleware

在我的本地主机和大多数用户的生产环境中,一切正常。但是对于某些用户,我会收到403 CSRF验证错误。

我添加了很多调试信息。结果表明,即使CsrfViewMiddleware设置了csrftoken也在响应中设置了cookie,在实际的浏览器中也没有设置cookie($.cookie('csrftoken')null)。因此,在进行ajax调用时,请求中没有cookie。

所以,我想这几乎意味着某些用户的浏览器正在阻止此Cookie?其他人有这种经历吗?

1 个答案:

答案 0 :(得分:2)

大多数浏览器都可以选择“阻止所有cookie”。您可能想在javascript中检测到该错误,并向您的用户发出警告,要求某些功能性cookie才能使网站正常工作。还有另一个SO question展示了如何做到这一点。

或者,从隐藏的输入字段中获取令牌({% csrf_token %}将在模板中添加该字段)。那应该一直有效。