【问题标题】:Do I need to enable HSTS in addition to forcing HTTPS in .htaccess?除了在 .htaccess 中强制使用 HTTPS 之外,我还需要启用 HSTS 吗?
【发布时间】:2017-03-17 19:51:17
【问题描述】:

我对这些东西一无所知,所以请在您的回复中回复 ELI5。

按照提供商 Dreamhost 的说明,我安装了 SSL 证书,然后将这些行添加到我的 .htaccess 文件中,以强制将 HTTP 请求重写为 HTTPS 请求。

# Redirect http requests to https
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

一切似乎都正常工作,即:每次我尝试使用 HTTP 访问该域下的页面时,它都会被重写为 HTTPS,并且地址栏中会显示“安全”图标。

我的问题是,我还需要启用 HSTS 吗?阅读它,它似乎与之前对 .htaccess 文件的更改完全相同。这是an excerpt from A2 Hosting(不是我的提供者):

启用 HSTS

为网站启用 HSTS 后,网络浏览器会自动更改任何 不安全请求 (http://) 到安全请求 (https://)。所有你 启用 HSTS 需要做的是在您网站的 .htaccess 中添加一个标题 文件。 Web 浏览器识别此标头,然后处理 休息,无需您进一步干预。

他们建议将此添加到 .htaccess:

Header set Strict-Transport-Security "max-age=31536000" env=HTTPS

Another tutorial,这一次特定于 Dreamhost,表示要启用 HSTS 并在 .htaccess 文件中强制使用 HTTPS,但并没有真正说明原因。此页面提出了一些稍微不同的建议:

Header set Strict-Transport-Security "max-age=31415926; includeSubDomains; preload" env=HTTPS

我需要“https 重写”代码 sn-p 和 HSTS 吗?还是只有“https 重写”代码 sn-p 就足够了?我是否需要 HSTS 代码,如果需要,我的帖子中的两行 HSTS 代码有什么区别?

【问题讨论】:

    标签: .htaccess ssl https hsts


    【解决方案1】:

    HSTS 让浏览器知道默认情况下仅通过 https 进行连接,但每个不同的标志都有一些不同:

    • 包括子域

    这意味着如果您的网站位于mydomain.com,则该政策将适用于所有子域(即foo.mydomain.combar.mydomain.com 等)。没有这个包括在内。该政策仅适用于有问题的确切域。

    • 预加载

    虽然 HSTS 在概念上很棒,但当有人第一次键入 mydomain.com 时,浏览器会尝试通过 http 方案联系您的网站,因为它不知道您的网站在 https 上,这给了 MITM 攻击者为您提供恶意版本网站的空间(又名TOFU 问题)。 为了解决这个问题,默认情况下应该在https 上联系网站的浏览器集中列表,但为了能够让自己进入该列表,您必须在该标题中有preload 标志。你可以看到更多关于这个here

    【讨论】:

    • 感谢HSTS两行代码的解释。但是,我想当我问我是否需要“两者”时,我的问题可能并不清楚。我所说的“两者”的意思是,我是否需要重定向 sn-p (在我的问题的顶部)和 HSTS 代码?或者我应该只选择一个,如果是,选择哪一个以及为什么?
    • @AlwaysLearning 两者都做。没有重定向的 HSTS 是没有用的,没有 HSTS 的重定向可以被中间人攻击拦截。
    • 没有重定向的 HSTS 在且仅当用户使用支持 HSTS 预加载的现代浏览器时才能正常工作。
    【解决方案2】:

    如果未明确指定方案(http 或 https),则默认值为 http。

    因此需要重定向以将其重定向到您首选的 https 版本,因为大多数键入 URL 的访问者不会包含该方案,因此转到 http 版本。

    HTTP Strict-Transport-Security (HSTS) 是一种安全方法,可确保您始终停留在 https 上。它并不是真的要消除对重定向的需要。特别是 HSTS 通过向您的网络浏览器发送一条消息(使用 HTTP 响应标头)说“请在接下来的 X 时间内仅在此站点上使用 https”。此消息仅应在通过 https 访问该站点时发送。因此,如果您一开始不重定向,那么很多访问者甚至可能没有意识到您有一个 https 站点,因此不会得到 HSTS 指令。

    HSTS 主要用于将网站的默认设置更改为 https,并防止中间人 (MITM) 攻击可能试图让您继续使用 http:例如如果您连接到黑客的 wifi 网络并访问您的银行网站,如果通过 https 完成,他们将无法劫持此连接,但如果通过 http 完成,他们将能够劫持此连接,因此攻击者将拦截 http 请求并停止重定向发生,让您使用 http 并拦截所有进出您银行的消息。

    您可以在 Web 浏览器的代码中“预加载”HSTS 指令,这样可以提供更高的安全性,因为您无需先通过 https 访问该站点即可获取 HSTS 指令。应该注意的是,基本上没有退路,只有在您真正了解 HSTS 时才应考虑这一点。 many, many, many requests to remove sites from Preload list Chrome 至少需要 3 个月(不保证其他浏览器),如果您不在 https 上,则在此期间您的网站完全无法访问。所以这里有一个真正的危险!特别是如果您的某些网站是通过 https 提供的(例如 www.example.com),但有些不是(例如 intranet.example.com)。这也是 HSTS 的危险,但预加载更危险。

    需要注意的另一点是,许多网络代理不会使用 HSTS,尤其是不会使用预加载列表(例如,搜索引擎爬虫、旧版浏览器......等)。因此,HSTS 应该再次用于重定向,而不是替代重定向。

    HSTS 是一项出色的安全措施,所有网站都应该使用(一旦他们完全停止使用 http),但与大多数安全措施一样,它也有其自身的风险。因此,请确保在部署之前了解它。我讨厌那些说打开它而不解释它和风险的网站和教程。理论上,使用 HSTS 的站点可能不再需要重定向,但实际上它仍然需要在第一次访问和不了解或不实施 HSTS 的代理时进行。

    总结一下:

    • 始终使用重定向。
    • 强烈考虑 HSTS,但首先阅读它,并从较低的 max-age 开始,不包含子域和预加载 - 直到您真正理解它们的含义。
    • 如果运行高风险站点,则考虑将您的站点提交到 HSTS 预加载列表作为高级别的安全性,但请再次注意此处的风险。仅当您真正了解 HSTS 并且觉得自己需要这种级别的安全性时才这样做。

    【讨论】:

      猜你喜欢
      • 2016-04-20
      • 2011-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-22
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      相关资源
      最近更新 更多