【发布时间】:2012-08-02 22:52:54
【问题描述】:
我们有一个刚刚开始向外界开放的小型网站。在大多数情况下,它运行良好,但我们偶尔会收到来自其中一种表单的消息“CSRF FAILURECSRF cookie not set”的 403 错误。该表单肯定包含{% csrf_token %},我们的中间件如下所示:
MIDDLEWARE_CLASSES = (
'django.middleware.csrf.CsrfViewMiddleware',
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
)
该表单对大多数人都适用,但我大约每天都会收到一封包含失败案例的电子邮件。电子邮件包含实际请求,如下所示(我已经删除了其余的 POST 数据以隐藏私有数据,但留下了 csrfmiddlewaretoken):
<WSGIRequest
path:/main/10/apply/,
GET:<QueryDict: {}>,
POST:<QueryDict: {u'csrfmiddlewaretoken': [u'IQQZvbVIggJm6Be6VinPHj8Qn3i3TdmG']}>,
COOKIES:{},
META:{'CONTENT_LENGTH': '111978',
'CONTENT_TYPE': 'multipart/form-data; boundary=----WebKitFormBoundaryLyo9BPXnAwKnt8ew',
'CSRF_COOKIE': 'XmSPWJZk2UwS4PNBXRmVlAaYDDdNaGqk',
CSRF_COOKIE 与 csrfmiddlewaretoken 不匹配,我认为这是导致问题的原因,但我无法弄清楚这些提交是如何不同步的,而其他提交则不然。该页面是一个非常简单的表单,只有几个字段。
关于我应该在哪里看的任何建议?我正在通过 apache 使用 mod_wsgi 在 CentOS 上运行最新的 Django 1.4.1。
编辑:与成功的请求相比,唯一看起来奇怪的另一件事是这里的 COOKIES:{} 部分是空的,这让我怀疑他们可能只是在他们的浏览器,但是为什么它会在 META 部分显示 CSRF_COOKIE 呢?
感谢您的帮助!
布兰登
【问题讨论】:
-
我遇到了同样的问题。你有想过解决办法吗?
-
有点。问题是某些用户关闭了 cookie,并且无法从服务器端修复它。我们最终关闭了面向公众的表单的 CSRF 保护。不要对登录页面或其他敏感数据执行此操作,但 CSRF 保护并不总是绝对必要的。
标签: django http-status-code-403 django-1.4 django-csrf