2012-04-22 19 views
4

私は中程度のトラフィック(1日あたり約4000/5000回の訪問)のDjango Webサイトを持っています。今日私はsettings.pyの "LOGGING"オプションを "Info"レベルのメールを送信するように設定しました。すべてがOKだったかどうかを確認してください...Django-Forbidden(CSRFクッキーが設定されていません)

私の驚きがあった、私は次のエラーが発生しました: [Django ](外部IPを)警告:禁止(CSRF Coo​​kieが設定されていない)

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でテストし、すべてのクッキーをクリーンアップしました...すべてうまくいきます。しかし、私はこのエラーを数十時間、いつも異なったIPにしているので、攻撃ではないと思う...私のフォームはすべて{%csrf_token%}django.middleware.csrf.CsrfViewMiddleware MIDDLEWARE_CLASSESに構成されています。

上記のログメッセージは、CSRF_COOKIEが空ではないことを明確に示しています。私はDjango 1.4を使用しています。

[UPDATED] 私はこれらのユーザーがクッキーを有効にしていないと思っています... だから...問題は:クッキーを有効にしていないユーザーでCSRFを使用する方法ですか?

+0

クライアントがクッキーを有効にしていない可能性はありますか?たぶんそのクローラまたはいくつかのランダムなクライアントタイプ。 – jdi

+0

Hello Jdi、POST変数これは有効なユーザー(クローラではない)です。クライアントがCookieを有効にしていない場合、「CSRF_COOKIE」は空になりませんか? – Thomas

+0

Jdi、ここでこのテストをしました...私はfirecookieでCSRF_COOKIEを削除しましたが、エラーが発生します。このようなエラーが多く発生するため、これが問題であるかどうかはわかりませんが、クッキーを有効にするにはどうすればユーザーに警告できますか? – Thomas

答えて

1

私の主なコメントで述べたように、CSRFの失敗のために403が発生すると、そのエラーが表示されます。

クッキーが有効になっていないユーザーに対してCSRFの保護を処理することについて心配する必要はありません。 CSRF攻撃の性質上、ブラウザのCookieを使用する必要があります。それらが使用されていない場合、CSRFで保護された要求は失敗します(あなたが見たように)。したがって、あなたはまだ保護されています。

DjangoはあなたがCSRFの障害発生時にクライアントに使用する特定のビューを設定することができます:本当にhttps://docs.djangoproject.com/en/dev/ref/settings/#std%3asetting-CSRF_FAILURE_VIEW

、あなたはPOSTしようとしている要求があることに注意してください以外何もする必要はありません無効な方法でサーバーに送信します。

関連する問題