5

中程度のトラフィック(1日あたり約4000/5000の訪問)のDjangoWebサイトがあります。今日、settings.pyの「LOGGING」オプションを設定して「Info」レベルのメールを送信しました。すべて問題がないかどうかを確認してください...

驚いたことに、次のエラーが発生します。[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でテストし、すべてのCookieをクリーンアップしました...すべて問題ありません。しかし、このエラーは常に異なるIPで何度も発生するため、攻撃ではないと思います...すべてのフォームに{%csrf_token%}が あり、django.middleware.csrf.CsrfViewMiddlewareはMIDDLEWARE_CLASSESで構成されています。

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

[更新]これらのユーザーはCookieを有効にしていないと思います...だから...問題は:Cookieを有効にしていないユーザーでCSRFを使用するにはどうすればよいですか?

4

1 に答える 1

2

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

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

Django では、CSRF の失敗時にクライアントに使用する特定のビューを設定できます: https://docs.djangoproject.com/en/dev/ref/settings/#std%3asetting-CSRF_FAILURE_VIEW

本当に、無効な方法でサーバーに POST しようとしているリクエストがあることに注意する以外に、何もする必要はありません。

于 2012-04-23T00:08:49.617 に答える