gpt4 book ai didi

django - 为什么 Django 的 CSRF 不能通过 HTTPS 工作?

转载 作者:行者123 更新时间:2023-12-04 23:02:35 34 4
gpt4 key购买 nike

我在 http://example.com 上有一个 Django 网站效果很好,包括发布请求。我添加了 HTTPS,所以我的网站可以通过 https://example.com 访问也。

我可以在 HTTPS 上加载任何页面,但是当我尝试 POST 时总是收到 CSRF 验证错误。 POST 请求在 HTTP 上工作正常。

我的 Django 进程在 nginx 后面使用 gunicorn 运行,并且我有 nginx 设置 X_Forwarded_For .因此,HTTPS 请求具有以下 header (取自 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 请求具有以下 header :
'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 上不起作用?

最佳答案

原来这是一个nginx配置问题。我的服务器设置是:

nginx -> nginx -> gunicorn

在第二个 nginx 系统上,我有

proxy_set_header        Host            $host:$server_port;

但是,由于 HTTPS 在第一个 nginx 处终止, $server_port一直是80。

在 HTTPS 上, Django does strict referer checking (见第 4 点)。查看Django源代码:
good_referer = 'https://%s/' % request.get_host()
if not same_origin(referer, good_referer):
reason = REASON_BAD_REFERER % (referer, good_referer)
logger.warning('Forbidden (%s): %s', reason, request.path,
extra={
'status_code': 403,
'request': request,
}
)
return self._reject(request, reason)

CSRF 验证失败,因为 "https://example.com/" != "https://example.com:80/" .

关于django - 为什么 Django 的 CSRF 不能通过 HTTPS 工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19593048/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com