【发布时间】:2018-09-20 01:50:12
【问题描述】:
我正在尝试将我的 Django + Heroku 应用程序从 http 重定向到 https,但我很惊讶我没有找到任何安全和直接的方法。
问题
您已经配置了一个 SSL 端点,现在您想要您的应用程序 对所有请求使用 https。
分辨率
重定向需要在应用程序级别执行,因为 Heroku 路由器不提供此功能。你应该编码 将逻辑重定向到您的应用程序中。
在底层,Heroku 路由器(重写)写入 X-Forwarded-Proto 和 X-Forwarded-Port 请求标头。该应用程序检查 X-Forwarded-Proto 并在不是 https 而是 http 时以重定向响应进行响应。
...
Django
将
SECURE_SSL_REDIRECT设置为True。
所以它必须在 Django 中完成。 This is the most complete answer我找到了,和this one也差不多。
Django 1.8 将核心支持非 HTTPS 重定向(集成 从 django-secure):
SECURE_SSL_REDIRECT = True SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')为了处理
SECURE_SSL_REDIRECT,您必须使用SecurityMiddleware:MIDDLEWARE = [ ... 'django.middleware.security.SecurityMiddleware', ]
请注意,两者都使用
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
似乎没有这个设置,它在 Heroku 上不起作用。现在是有趣/可怕的部分。如docs 中所述:
SECURE_SSL_REDIRECT
...
如果将此设置为 True 会导致无限重定向,这可能意味着 您的网站在代理后面运行,无法分辨哪些请求是 安全,哪些不安全。您的代理可能会设置一个标头来指示 安全请求;您可以通过找出问题来纠正问题 标头是并配置
SECURE_PROXY_SSL_HEADER设置 相应地。
然后,检查SECURE_PROXY_SSL_HEADER:
警告
如果您设置此选项,您可能会在您的网站中打开安全漏洞 不知道你在做什么。如果你没有设置它,当你 应该。认真的。
这让我想找到一个更安全的解决方案...在this other question 中它说应该没问题,但我认为它没有足够的说服力来忽略这样的警告。 p>
难道 Django 真的没有任何其他安全可以实施的解决方案吗?
我使用的是 1.11 版
更新:
我找到了django-sslify package,但它也需要设置SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https'),所以我想它在潜在的安全漏洞方面没有什么区别。如果这个假设是错误的,请纠正我。
【问题讨论】:
-
一个similar question 上周居然发帖了,但是没有答案...
-
只是想说我在 Python 3.6.6/Django 2.1/Heroku/Gunicorn mix 上的包取得了成功。
-
你能写一个答案来扩展你是如何做到的吗?它可能对许多人有帮助:)
-
感谢@J0ANMM 联系我。事实证明仍然存在一个可能的问题。我 pip 安装了 Randall 的工作,根据文档进行了配置(包括 Heroku 的 SECURE_PROXY_SSL_HEADER)和 TBH,它解决的唯一问题是重定向问题,并且 https 没有 www 和没有 www 的错误。 http 到 https 的重定向不起作用。由于我无法确认我的应用程序是阻止程序还是代码需要更新,所以我进入了我的 DNS (CloudFlare) 并使用规则转发到 https。在停机期间,我计划在 Heroku 上启动一个测试项目以确认包操作,直到那时我正在运行。
-
我在这里找到了这个答案,为我工作! stackoverflow.com/a/49112662/10407102
标签: django heroku https http-redirect django-settings