即使包含csrf令牌,Django CSRF验证也会失败

时间:2016-05-13 03:49:01

标签: django

我知道在提交时csrf令牌未包含在表单中时会发生此错误,但这次并非如此。

我正在尝试登录管理站点。管理员登录表单包含csrf令牌,我可以看到该csrf令牌的值与csrf cookie的值相匹配。此外,当我提交时,我可以看到相同的csrf令牌被发布到服务器。

但是,我仍然收到CSRF verification failed消息。我相信如果我清除了它可以使用的cookie,但我不明白为什么会这样?

关于我的会话引擎设置需要注意的一件事:

SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'

我不知道这个设置是否重要,但我应该指出。

更新:好的,我打开了调试,这里有更多信息:

Reason given for failure:

    CSRF cookie not set.

通常,当存在真正的跨站点请求伪造,或者Django的CSRF机制未正确使用时,可能会发生这种情况。对于POST表单,您需要确保:

  

您的浏览器正在接受Cookie。

我很确定我的浏览器接受cookie。因为我可以在浏览器中看到cookie值,所以我可以看到cookie已在http标头中设置:

Set-Cookie:csrftoken=j2tSkjxUyeY90NZhUcMZ5GEdDKEa0wdW; expires=Fri, 12-May-2017 07:28:00 GMT; Max-Age=31449600; Path=/
  

view函数将请求传递给模板的render方法。   在模板中,每个POST表单中都有一个{%csrf_token%}模板标记,用于定位内部网址。

由于我使用的是Django自己的管理页面,我相信there is a {% csrf_token %} template tag inside each POST form that targets an internal URL.

此外,我可以看到后期操作发生的时间,csrf值传递:

csrfmiddlewaretoken=j2tSkjxUyeY90NZhUcMZ5GEdDKEa0wdW&username=cheng&password=&next=%2Fadmin%2F

我删除了密码字段的值,原因很明显。

  

如果您不使用CsrfViewMiddleware,则必须在使用csrf_token模板标记的任何视图以及接受POST数据的视图上使用csrf_protect。

好吧,我的settings.py文件中有CsrfViewMIddleWare。此外,Django自己的管理站点知道如何处理csrf_token。

之前我见过这个错误,我通过清除cookie解决了这个问题。但对于不了解饼干的普通用户来说,这可能是一个阻碍。我怀疑它与cookie引擎设置有关。

1 个答案:

答案 0 :(得分:1)

此问题可能是由于您对表单所做的更改(即添加{%crsf_token%})没有生效。刷新您的表单页,然后再次提供输入。可能工作正常。