2012-04-22 114 views
4

我有一箇中等流量的Django網站(每天約4000/5000次訪問)。今天我在settings.py上配置了「LOGGING」選項來發送一個包含「Info」級別的電子郵件,只是檢查一切是否正常...Django - 禁止(CSRF cookie未設置。)

有我驚訝,我得到以下錯誤: [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)}> 

我試圖重現此錯誤,但我couldn't。我測試了Firefox和Chrome,清理了所有的Cookie ......一切都很好。但我得到這個錯誤十幾次,總是與不同的IP,所以我認爲這不是一個攻擊......我所有的表單都有{%csrf_token%}django.middleware.csrf.CsrfViewMiddleware在MIDDLEWARE_CLASSES上配置。

上面的日誌消息非常明確,CSRF_COOKIE不是空的。我正在使用Django 1.4。

[已更新] 我認爲這些用戶沒有啓用Cookie ... 所以...問題是:如何使用沒有啓用cookie的用戶使用CSRF?

+0

難道客戶端沒有啓用cookies嗎?也許它是一個爬蟲或一些隨機的客戶端類型。 – jdi 2012-04-22 01:32:24

+0

你好Jdi,POST變量我可以看到它是一個有效的用戶(不是履帶)。如果客戶沒有啓用Cookie,那麼「CSRF_COOKIE」不會是空的? – Thomas 2012-04-22 01:38:44

+0

Jdi,我只是在這裏做了這個測試...我用firecookie移除了CSRF_COOKIE,並且我得到了錯誤。我不確定這是否是問題,因爲我收到了很多類似的錯誤,但是您知道如何提醒用戶啓用Cookie嗎? – Thomas 2012-04-22 01:44:38

回答

1

正如我在主要評論中提到的,當由於CSRF失敗而引發403時,您將看到該錯誤。

您不應該擔心在未啓用Cookie的情況下嘗試處理針對用戶的CSRF保護。 CSRF攻擊的本質要求使用瀏覽器cookie。如果它們沒有被使用,CSRF保護的請求將失敗(如你所見)。因此,你仍然受到保護。

的Django可以讓你設置一個特定視圖在一個CSRF失敗的情況下使用客戶端:https://docs.djangoproject.com/en/dev/ref/settings/#std%3asetting-CSRF_FAILURE_VIEW

真的,你不應該需要做的注意,有那些試圖POST請求的其他任何以無效的方式到您的服務器。