http
重定向到https
,但我惊讶地发现没有任何安全和直接的方法。
根据Heroku的说法:问题: 您已经配置了SSL端点,现在希望您的应用程序对所有请求使用https。
解决方案: 由于Heroku路由器不提供此功能,因此必须在应用程序级别执行重定向。您应该将重定向逻辑编码到您的应用程序中。
在幕后,Heroku路由器(超过)写入X-Forwarded-Proto和X-Forwarded-Port请求头。当X-Forwarded-Proto不是https而是http时,应用程序检查X-Forwarded-Proto并响应重定向响应。 Django 将
SECURE_SSL_REDIRECT
设置为True
。所以必须在Django中完成。我找到了这个最完整的答案,这个也相似。
注意两者都使用Django 1.8 will have core support for non-HTTPS redirect (integrated from django-secure):
SECURE_SSL_REDIRECT = True SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
In order for
SECURE_SSL_REDIRECT
to be handled you have to use theSecurityMiddleware
:
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 package,但它还需要设置
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
,所以我猜在潜在的安全漏洞方面没有什么区别。如果这个假设不正确,请纠正我。