DjangoHSTS头自动设置了吗

wen python案例 2

本文目录导读:

DjangoHSTS头自动设置了吗

  1. 核心设置项:SECURE_HSTS_SECONDS
  2. 自动检测是否通过 HTTPS 发送
  3. 其他相关设置(但不等于自动设置)
  4. 总结与最佳实践

在 Django 默认配置 下,Django 并不会自动设置 Strict-Transport-Security (HSTS) 头部

HSTS 头通常需要你显式配置后,Django 才会在响应中添加,Django 提供了一个非常便捷的设置项,让你只需打开一个开关即可启用。

以下是详细情况:

核心设置项:SECURE_HSTS_SECONDS

从 Django 3.0 开始,启用 HSTS 的主要方法是在 settings.py 中设置 SECURE_HSTS_SECONDS

  • 默认值: 0None,这表示未启用 HSTS。

  • 启用方法: 将其设置为一个大于 0 的整数(表示 HSTS 的有效期,单位为秒)。

    # settings.py
    # 启用 HSTS,有效期 1 年(31536000 秒)
    # 强烈推荐在生产环境中使用
    SECURE_HSTS_SECONDS = 31536000
    # 可选:是否包含子域名 (HSTS 的 includeSubDomains 指令)
    SECURE_HSTS_INCLUDE_SUBDOMAINS = True
    # 可选:是否允许预加载 (HSTS preload 指令)
    SECURE_HSTS_PRELOAD = True

当你设置了 SECURE_HSTS_SECONDS 后,Django 的 SecurityMiddleware(安全中间件)会自动在所有 HTTPS 响应 中添加 Strict-Transport-Security 头部。

自动检测是否通过 HTTPS 发送

Django 的安全中间件非常智能,它不会在 HTTP(非加密)响应中添加 HSTS 头,理由如下:

  • HSTS 头通过 HTTP 发送是没有意义的,因为 HSTS 的策略就是让浏览器只通过 HTTPS 访问你的网站,如果攻击者拦截了 HTTP 响应,他们可以篡改或移除这个头部。
  • Django 默认会根据 request.is_secure() 方法来判断请求是否是通过 HTTPS 发起的。

重要提示: 如果你在生产环境使用反向代理(如 Nginx),需要在 Django 的 settings.py 中配置 SECURE_PROXY_SSL_HEADER,让 Django 正确识别来自代理的 HTTPS 请求,否则,即使用户访问的是你的 HTTPS 网站,Django 也可能认为请求是 HTTP 的,从而导致不发送 HSTS 头。

# 如果你使用 Nginx 或类似的反向代理,并且它设置了 HTTPS 相关的头部
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

其他相关设置(但不等于自动设置)

  • SECURE_SSL_REDIRECT 这个设置会将所有 HTTP 请求重定向到 HTTPS,但它本身不设置 HSTS 头SECURE_SSL_REDIRECTStrict-Transport-Security前置条件(因为 HSTS 只对 HTTPS 有意义),但它们是完全不同的两个设置。
  • SESSION_COOKIE_SECURECSRF_COOKIE_SECURE 它们只控制 Cookie 是否通过 HTTPS 传输,与 HSTS 头部无关。

总结与最佳实践

状态 设置方法 说明
未启用 (默认) SECURE_HSTS_SECONDS = 0 或未设置 不发送 HSTS 头。
已启用 SECURE_HSTS_SECONDS > 0 Django 在 HTTPS 响应中自动添加 HSTS 头。

推荐的配置步骤(生产环境):

  1. 确保所有流量都通过 HTTPS 访问。 (使用 SECURE_SSL_REDIRECT = True 或服务器端重定向)。
  2. 告诉 Django 如何判断 HTTPS 请求。 (设置 SECURE_PROXY_SSL_HEADER)。
  3. 设置 HSTS。
# settings.py (生产环境片段)
SECURE_SSL_REDIRECT = True  # 将 HTTP 重定向到 HTTPS
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') # 如果使用反向代理
# 启用 HSTS,有效期 1 年
SECURE_HSTS_SECONDS = 31536000
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True

一句话:Django 不会自动设 HSTS 头,但给你提供了一个超级简单的“开关”,你只需要在 settings.py 里写上 SECURE_HSTS_SECONDS = 31536000,它就会帮你搞定所有加密响应中的 HSTS 头。

抱歉,评论功能暂时关闭!