HTTP 请求 headers 在重定向到 HTTPS 之前是否可保护?

Are HTTP request headers protectable prior to a redirect to HTTPS?

我正在尝试运行 HTTPS 站点,同时考虑到某些请求最初会尝试通过普通 HTTP 建立 non-secure 连接的可能性。我可以成功地将 http:// 重定向到 https://,但这种方法似乎将临时用户暴露在一个不可接受的漏洞中:因为必须在服务器知道 whether/where 之前传输 URI 和主机地址(重新)定向请求,窃听者可以查看初始 HTTP request/response headers。用户可能会被窃听者欺骗,例如,窃听者读取 http:// 请求 header 并提供一个与用户期望看到的页面非常相似的页面。

服务器能否采取中间操作,例如在客户端发送请求之前将 HTTP 连接移至 HTTPS header,以便传输 request/response header s 是否与内容本身的传输一样受到保护?如果连接本来是non-secure,是不是无法保护客户端和服务器之间的headers传输?

您应该查看 HTTP Strict Transport Security(HSTS). This will allow your site to indicate to modern browsers 它应该只通过 HTTPS 加载。

这仍然会使您的用户在第一次访问您的网站时容易受到 man-in-the-middle 攻击 (TOFU). You can only mitigate this by getting your site on the preloaded HSTS list.

是的,这是一个风险,这是创建 HTTP 严格传输协议 (HSTS) 以解决的漏洞。

想法是,一旦您连接到 HTTPS 站点,服务器就会发回一个 HTTP Header,如下所示:

Strict-Transport-Security "max-age=2592000;"

这会告诉浏览器:"for the next 30 days (60 * 60 * 24 * 30 = 2592000) do NOT connect via HTTP but instead upgrade any HTTP request to HTTPS automatically before you send the request." 在 Chrome 中,您会在开发人员工具中看到 307 互联网重定向。

为什么是 30 天?好吧,它必须是可缓存的,浏览器才有用,你可以决定缓存多长时间。有人建议 1 年甚至 2 年(分别为 31536000 或 63072000 秒)。

您还可以指定一个 includeSubDomains header 这样子域也会自动受到保护(尽管它们显然也应该 return header 以防有人直接访问子域):

Strict-Transport-Security "max-age=2592000; includeSubDomains"

这对于更好地保护 cookie 是必要的,因为假的子域可以获取或设置 parent 域的 cookie 并劫持 session。然而,如果子域不在 HTTPS 上,这会有危险——它可能并不总是 apparent。例如。如果您在内部使用您的主域名并且在 http://intranet.example.com 有一个站点,那么它可能会停止工作,直到您将其升级到 HTTPS 或更改策略并等待之前的 max-age 时间到期。

这仍然存在风险,因为需要建立第一个连接才能获取此 header 以将此策略添加到您的浏览器缓存中。这是对首次使用 (TOFU) 政策的信任。同样,如果在获得保单后访问很长时间,您也会遇到同样的情况。出于这个原因,您可以将您的站点提交到预加载列表,以便浏览器将您的站点硬编码到其中,因此它始终假定已设置 HSTS。使用这个网站来做到这一点:https://hstspreload.appspot.com。这听起来不错,但并非没有风险。一旦您将您的站点提交到此列表,就几乎不可能将其删除,因此它基本上是对 HTTPS 的永久承诺。也许没什么坏事,但你还需要有一个很长的有效期,includeSubDomains 设置并添加预加载设置:

Strict-Transport-Security "max-age=2592000; includeSubDomains; preload"

我个人认为这是矫枉过正并且可能非常危险,因为它不受您的控制并且不容易逆转。恕我直言,只有高知名度的网站(网上银行、电子商务网站、Google、Facebook、Twitter...等)才需要预加载,但这是你自己的选择。

有关我的博客文章的更多信息: https://www.tunetheweb.com/security/http-security-headers/hsts/ https://www.tunetheweb.com/blog/dangerous-web-security-features/