在大多数运行正常的应用程序中,我一直遇到零星的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?其他人有这种经历吗?
答案 0 :(得分:2)
大多数浏览器都可以选择“阻止所有cookie”。您可能想在javascript中检测到该错误,并向您的用户发出警告,要求某些功能性cookie才能使网站正常工作。还有另一个SO question展示了如何做到这一点。
或者,从隐藏的输入字段中获取令牌({% csrf_token %}
将在模板中添加该字段)。那应该一直有效。