5

我们有一个刚刚开始向外界开放的小网站。在大多数情况下,它运行良好,但我们偶尔会收到来自其中一种表单的消息“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:{}部​​分是空的,这会让我怀疑他们可能只是在浏览器中禁用了 cookie,但是为什么它会出现在 CSRF_COOKIE 中元部分?

谢谢你的帮助!

布兰登

4

1 回答 1

1

HTTP_COOKIE 也是空白的吗?

可能是 django 在请求中没有看到 CSRF 令牌 cookie,它正在生成一个的CSRF_COOKIE 并将其放入 meta 中。

于 2014-01-24T19:39:47.707 回答