2012-04-22 7 views
4

У меня есть сайт Django со средним трафиком (около 4000/5000 посещений в день). Сегодня я настроил опцию «LOGGING» на settings.py, чтобы отправить электронное письмо с уровнем «Информация», просто проверьте, все ли в порядке ...Django - Запрещено (CSRF cookie не установлен.)

Было мое удивление, я получаю сообщение об ошибке: [Django ] ПРЕДУПРЕЖДЕНИЕ (ВНЕШНИЙ IP): Запретный (CSRF печенье не установлен.)

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)}> 

Я попытался воспроизвести эту ошибку, но я couldn't. Я тестирую Firefox и Chrome, очищаю все файлы cookie ... Все в порядке. Но я получаю эту ошибку дюжину времени, всегда с разными IP-адресами, поэтому я полагаю, что это не атака ... Вся моя форма имеет {% csrf_token%} и django.middleware.csrf.CsrfViewMiddleware настроен на MIDDLEWARE_CLASSES.

Сообщение журнала очень ясно, что CSRF_COOKIE не является пустым. Я использую Django 1.4.

[ОБНОВЛЕНО] Я думаю, что тезисы пользователей не имеют файлов cookie, включенных ... Итак ... Проблема в том, как использовать CSRF с пользователями, у которых нет файлов cookie?

+0

Может быть, у клиента нет файлов cookie? Может быть, это сканер или какой-то случайный тип клиента. – jdi

+0

Здравствуйте, Jdi, переменная POST Я вижу, что это действительный пользователь (а не искатель). Если у клиента нет cookie, значит, CSRF_COOKIE не будет пустым? – Thomas

+0

Jdi, я просто сделал этот тест здесь ... Я удалил CSRF_COOKIE с firecookie, и я получил ошибку. Я не уверен, что это проблема, потому что я получаю много таких ошибок, но знаете ли вы, как я могу предупредить пользователя о включении файлов cookie? – Thomas

ответ

1

Как я уже упоминал в своем главном комментарии, вы увидите эту ошибку, когда 403 поднят из-за сбоя CSRF.

Вам не нужно беспокоиться о попытке обработать защиту CSRF от пользователей без использования файлов cookie. Сама природа атаки CSRF требует использования файлов cookie браузера. Если они не используются, запрос, защищенный CSRF, не будет работать (как вы видели). Таким образом, вы по-прежнему защищены.

Джанго позволяет установить конкретный вид использования для клиента в случае выхода из строя CSRF: https://docs.djangoproject.com/en/dev/ref/settings/#std%3asetting-CSRF_FAILURE_VIEW

Действительно, вам не нужно делать ничего, кроме отметить, что есть запросы, которые пытаются POST на ваш сервер недопустимым способом.

Смежные вопросы