Django:为Heroku应用将http安全重定向到https。

问题描述 投票:1回答:1

我正试图将我的Django + Heroku应用程序从以下地方重定向 httphttps但我很惊讶,我没有发现任何的。安全的 和直接的方式。

据Heroku介绍:

问题

你已经配置了一个SSL端点,现在你想让你的应用程序对所有请求使用https。

解决方法

重定向需要在应用层执行,因为Heroku路由器不提供这个功能。您应该在您的应用程序中编写重定向逻辑。

在下面,Heroku路由器(over)写入X-Forwarded-Proto和X-Forwarded-Port请求头。应用程序检查X-Forwarded-Proto,并在不是https而是http的情况下用重定向响应。

...

姜戈

设置 SECURE_SSL_REDIRECTTrue.

所以必须在Django处完成。这是最完整的答案 我发现,和 这个 也是类似的。

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上是不行的。现在是有趣的部分。正如在 文件:

SECURE_SSL_REDIRECT

...

如果将此设置为True会导致无限重定向,这可能意味着你的网站是在代理服务器后面运行的,并且无法判断哪些请求是安全的,哪些不是。您的代理服务器可能会设置一个头来指示安全请求;您可以通过找出该头的内容并配置好的 SECURE_PROXY_SSL_HEADER 据此进行设置。

然后,检查关于 SECURE_PROXY_SSL_HEADER:

警告

如果你在不知道自己在做什么的情况下设置这个,很可能会给你的网站打开安全漏洞。而如果你在应该设置的时候没有设置。认真的说。

这让我想找到一个更安全的解决方案... ... 在 这另一个问题 它说 应该没问题但我觉得它没有足够的说服力来忽略这样的警告。

难道Django真的没有其他的解决方案吗?安全的 来实现?

我使用的是1.11版本


更新。

我找到了 django-sslify包但它也需要设置 SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https'),所以我想它在潜在的安全漏洞方面并没有什么区别。如果这个假设是错误的,请纠正我。

django heroku https http-redirect django-settings
1个回答
0
投票

我迟到了,但我认为这里的关键是简单地理解你正在做什么。我希望我明白我在做什么,但说实话,我不是100%确定。我认为如果你盲目使用HTTP_X_FORWARDED_PROTO是很危险的,因为它会让Django认为你正在接收一个HTTPS请求(即使HTTP_X_FORWARDED_PROTO事实上是被欺骗的)。

但是,如果你使用的是一个正常运行的负载均衡代理(比如AWS),那么你可以确信HTTP_X_FORWARDED_PROTO的设置是正确的。在这种情况下,HTTP_X_FORWARDED_PROTO的作用是告诉Django,它很好,不要担心(因为你相信代理不允许通过欺骗的头),并停止尝试不断重定向到SSL。

最后,HTTP_X_FORWARDED_PROTO在代理负载均衡器背后是必要的,即使你 不是 使用SECURE_SSL_REDIRECT = True(例如,如果重定向是在一个正确配置的Web服务器中发生的,然后再到Django),因为它也会影响请求上的is_secure()函数,如果你的代理服务器正在吞噬原始请求,它将始终是假的(例如,从客户端和你的代理负载平衡器之间的HTTPS到你的代理负载平衡器和Web服务器之间的HTTP是很常见的)。

来源于 https:/docs.djangoproject.comen3.0refsettings#std:setting-SECURE_PROXY_SSL_HEADER 但我不得不读了多遍才把这一切在脑海中拼凑出来。

© www.soinside.com 2019 - 2024. All rights reserved.