8

http://example.comに Django Web サイトがあり、投稿リクエストを含めて正常に動作します。https://example.comでもサイトにアクセスできるように、HTTPS を追加しました。

HTTPS で任意のページを読み込むことができますが、POST しようとすると常に CSRF 検証エラーが発生します。POST リクエストは HTTP で正常に機能します。

私のDjangoプロセスはnginxの背後でgunicornで実行されており、nginx設定がありますX_Forwarded_For. したがって、HTTPS 要求には次のヘッダーがあります (から取得request.META)。

'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'HTTP_ACCEPT_ENCODING': 'gzip, deflate',
'HTTP_ACCEPT_LANGUAGE': 'en-US,en;q=0.5',
'HTTP_CONNECTION': 'close',
'HTTP_COOKIE': 'redacted',
'HTTP_HOST': 'example.com:80',
'HTTP_REFERER': 'https://example.com/user/delete/49/',
'HTTP_USER_AGENT': 'Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0',
'HTTP_X_FORWARDED_FOR': '1.2.3.4, 192.168.252.22',
'HTTP_X_FORWARDED_PROTO': 'https',
'HTTP_X_REAL_IP': '1.2.3.4',

HTTP リクエストには次のヘッダーがあります。

'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'HTTP_ACCEPT_ENCODING': 'gzip, deflate',
'HTTP_ACCEPT_LANGUAGE': 'en-US,en;q=0.5',
'HTTP_CONNECTION': 'close',
'HTTP_COOKIE': 'redacted',
'HTTP_HOST': 'example.com.com:80',
'HTTP_USER_AGENT': 'Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0',
'HTTP_X_FORWARDED_FOR': '1.2.3.4, 192.168.252.22',
'HTTP_X_FORWARDED_PROTO': 'http',
'HTTP_X_REAL_IP': '1.2.3.4',

HTTP では問題がないのに、CSRF が HTTPS で機能しないのはなぜですか?

4

5 に答える 5

0

私の場合、HTTPS を使用するパブリック ホストがありましたが、内部ホストは HTTP であったため、転送https://myhost.com/path/http://internal-host.myhost.com/path失敗しました。構成は次のとおりです。

location @proxy_to_app {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    # the following means the $scheme e.g. https is forwarded
    # disabling this fixes the problem
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://app_server;
}
于 2022-02-23T16:15:10.583 に答える
-2

CsrfViewMiddlewareの実装を見ると

request.is_secure()の場合、Django は 'Referer' ヘッダーをチェックします。

good_referer = 'https://%s/' % request.get_host()
if not same_origin(referer, good_referer):
    reason = REASON_BAD_REFERER % (referer, good_referer)
    return self._reject(request, reason)
于 2014-11-13T13:02:10.667 に答える