2012-08-05 92 views
5

我们有一个小型网站刚刚开始暴露于外部世界。大多数情况下它运行得非常好,但偶尔会从其中一个表单中收到“CSRF FAILURECSRF cookie未设置”消息的403错误。形式肯定有包括{% csrf_token %},我们的中间件是这样的:django零星403“CSRF FAILURECSRF饼干未设置”错误

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 ,这正是我所假设的导致这个问题的原因,但我无法弄清楚它们是如何在一些提交中不同步的,而不是其他的。该页面是一个非常简单的形式,只有几个字段。

任何建议,我应该看看?我使用mod_wsgi通过apache在CentOS上运行最新的Django 1.4.1。

编辑:相比成功请求这似乎很奇怪的唯一的另一件事是,这里的COOKIES:{}部分是空的,这将导致我怀疑,也许他们只是在他们的浏览器禁用Cookie,但那么为什么它显示在META部分中的CSRF_COOKIE?

感谢您的帮助!

布兰登

+0

我遇到了这个完全相同的问题。你有没有想出一个解决方案? – 2014-03-24 17:43:48

+0

类别。问题在于一些用户关闭了cookie,并且无法从服务器端修复该问题。我们最终关闭了面向公众的CSRF保护。不要对登录页面或其他敏感数据执行此操作,但CSRF保护并非总是非常必要。 – brandon 2014-03-25 18:50:22

回答

0

HTTP_COOKIE也是空白的吗?

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