【问题标题】:HSTS and HTTPS settings InvalidHSTS 和 HTTPS 设置无效
【发布时间】:2019-10-27 14:01:02
【问题描述】:

我按照 django 文档所说的设置了几个设置,但我遇到了两个问题:

  1. SecurityMiddleware 无效
  2. 曾经SECURE_SSL_REDIRECT = True网站将无法访问

SecurityMiddleware 应该设置 Strict-Transport-Security: max-age=31536000; includeSubDomains 是响应头,但我通过 chrome F12 检查,响应头是这样的:

Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Thu, 13 Jun 2019 02:18:17 GMT
Server: openresty/1.15.8.1
Set-Cookie: uid=e59e2b54f7d64a6799b0f160dc80fae6; expires=Sun, 10 Jun 2029 02:18:17 GMT; HttpOnly; Max-Age=315360000; Path=/
Transfer-Encoding: chunked
X-Frame-Options: SAMEORIGIN

其中没有严格的传输安全性

我使用 nginx 重定向,但我仍然想知道为什么 SECURE_SSL_REDIRECT = True 导致网站 unavliabe 访问,如果此设置有其他影响? chrome 显示ERR_TOO_MANY_REDIRECTS

django 设置:

MIDDLEWARE = [
   # 'django.middleware.cache.UpdateCacheMiddleware',
    'blog.middleware.user_id.UserIDMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ALLOWED_HOSTS = ['www.xxxxxx.club']

#SECURE_SSL_REDIRECT = True
CSRF_COOKIE_SECURE = True
SESSION_COOKIE_SECURE = True
SECURE_HSTS_SECONDS = 31536000
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True

【问题讨论】:

  • 您没有将 cookie 设置为安全?

标签: django-2.1


【解决方案1】:

我想出了这两个问题,两个问题是同一个原因造成的。 我使用 nginx 作为代理,并在 nginx 中将重定向 HTTP 设置为 HTTPS,但是

代理可能会“吞下”请求是 HTTPS 的事实,使用代理和 Django 之间的非 HTTPS 连接

所以django总是得到HTTP请求,同时设置SECURE_SSL_REDIRECT = True所有http重定向到HTTPS,但是所有这些HTTPS在代理和Django之间又会变成http,这就是导致无限重定向的原因。

如果SECURE_SSL_REDIRECT = False django 不会从 nginx 重定向 http,并且 django 只会在 HTTPS 响应标头中设置 strict-transport-security,这就是为什么即使我的浏览器收到 https 响应(通过 nginx,没有 django),没有 strict-transport-security在响应头 所以我改变了一些设置:

  1. 在 django 设置中设置 SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
  2. 在 nginx conf 的 443 端口内设置proxy_set_header X-Forwarded-Proto $scheme;

https://github.com/richardcornish/django-removewww/issues/1 https://docs.djangoproject.com/en/2.1/ref/settings/#std:setting-SECURE_PROXY_SSL_HEADER https://stackoverflow.com/a/41488430/11350098

【讨论】:

  • 我在 daphne 上进行了无限重定向(重定向太多)。设置 SECURE_SSL_REDIRECT = True 是 nginx 出现问题的原因。但是我已经按照您的建议设置了 SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') ,现在可以使用了。谢谢!很好的解决方案。
猜你喜欢
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
  • 2014-07-31
  • 2017-11-22
  • 2022-12-09
  • 1970-01-01
  • 1970-01-01
  • 2018-04-02
相关资源
最近更新 更多