Django - Forbidden(未设置CSRF cookie。)

时间:2012-04-22 01:15:21

标签: django django-forms django-csrf

我有一个中等流量的Django网站(每天大约4000/5000次访问)。今天我在settings.py上配置了“LOGGING”选项,发送一个“Info”级别的电子邮件,只需检查一切是否正常......

令我惊讶的是,我收到以下错误: [Django]警告(外部IP):禁止(未设置CSRF cookie。)

No stack trace available

<WSGIRequest
path:/cadastro/usuario/,
GET:<QueryDict: {}>,
POST:<QueryDict: {**xxxxxxx (some varibles....) and**: u'csrfmiddlewaretoken': [u'4wqRKQXZsTmXJaOkCsGobWyG1rzihc8x'], }>,
COOKIES:{},
META:{'CONTENT_LENGTH': '381',
 'CONTENT_TYPE': 'application/x-www-form-urlencoded',
 'CSRF_COOKIE': 'qzc4i7JdHoQLJ8N5aI9MTlamOZMOKmP0',
 'DOCUMENT_ROOT': '/opt/nginx/html',
 'HTTP_ACCEPT': 'text/html, application/xhtml+xml, */*',
 'HTTP_ACCEPT_ENCODING': 'gzip, deflate',
 'HTTP_ACCEPT_LANGUAGE': 'pt-BR',
 'HTTP_CACHE_CONTROL': 'no-cache',
 'HTTP_CONNECTION': 'Keep-Alive',
 'HTTP_CONTENT_LENGTH': '381',
 'HTTP_CONTENT_TYPE': 'application/x-www-form-urlencoded',
 'HTTP_HOST': 'xxxxxx',
 'HTTP_REFERER': 'http://xxxx/y/z',
 'HTTP_USER_AGENT': 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)',
 'PATH_INFO': u'/y/z',
 'QUERY_STRING': '',
 'REMOTE_ADDR': '187.27.35.123',
 'REMOTE_PORT': '54221',
 'REQUEST_METHOD': 'POST',
 'REQUEST_URI': 'y/z',
 'SCRIPT_NAME': u'',
 'SERVER_NAME': 'xxxxxxx',
 'SERVER_PORT': '80',
 'SERVER_PROTOCOL': 'HTTP/1.1',
 'uwsgi.version': '0.9.6.5',
 'wsgi.errors': <open file 'wsgi_input', mode 'w' at 0xa126338>,
 'wsgi.file_wrapper': <built-in function uwsgi_sendfile>,
 'wsgi.input': <open file 'wsgi_input', mode 'r' at 0xa126a70>,


 'wsgi.multiprocess': True,
 'wsgi.multithread': False,
 'wsgi.run_once': False,
 'wsgi.url_scheme': 'http',
 'wsgi.version': (1, 0)}>

我试图重现这个错误,但我不能。我在Firefox和Chrome上测试,清理了所有的cookie ......一切都很好。但我得到这个错误十几次,总是使用不同的IP,所以我认为这不是攻击......我所有的表单都有 {%csrf_token%} django .middleware.csrf.CsrfViewMiddleware 在MIDDLEWARE_CLASSES上配置。

上面的日志消息非常清楚 CSRF_COOKIE 不为空。我正在使用Django 1.4。

[增订] 我认为这些用户没有启用cookie ... 所以...问题是:如何在没有启用cookie的用户中使用CSRF?

1 个答案:

答案 0 :(得分:2)

正如我在主要评论中提到的,当由于CSRF失败而引发403时,您将看到该错误。

您不必担心在未启用Cookie的情况下尝试对用户进行CSRF保护。 CSRF攻击的本质需要使用浏览器cookie。如果未使用它们,受CSRF保护的请求将失败(如您所见)。因此,您仍然受到保护。

Django允许您设置在CSRF失败时用于客户端的特定视图:https://docs.djangoproject.com/en/dev/ref/settings/#std%3asetting-CSRF_FAILURE_VIEW

实际上,除了请注意有些请求试图以无效方式POST到您的服务器之外,您不需要做任何事情。