我正在尝试操作HTTPS站点,同时考虑某些请求最初会尝试通过纯HTTP进行非安全连接的概率。我可以成功地将http://
重定向到https://
,但这种方法似乎会让临时用户暴露在一个不可接受的漏洞中:因为必须在服务器知道是否/在哪里之前传输URI和主机地址(re )直接请求,窃听者可以查看初始HTTP请求/响应头。例如,窃听者可以读取http://
请求标头并提供与用户期望看到的页面相似的页面。
服务器是否可以采取中间操作,例如在客户端发送请求标头之前将HTTP连接移至HTTPS,以便请求/响应标头的传输受到内容传输本身的保护?如果连接最初是不安全的,是否无法保护客户端和服务器之间的报头传输?
答案 0 :(得分:3)
您应该查看HTTP严格传输安全性(HSTS)。这将允许您的网站向modern browsers表明它只应通过HTTPS加载。
这仍然会让您的用户在首次访问您的网站时受到中间人攻击(TOFU)。您只能通过preloaded HSTS list上的网站来缓解此问题。
答案 1 :(得分:2)
是的,这是一个风险,这是一个创建HTTP严格传输协议(HSTS)来解决的漏洞。
这个想法是,一旦连接到HTTPS站点,服务器就会发回一个HTTP Header,如下所示:
Strict-Transport-Security "max-age=2592000;"
这告诉浏览器:"接下来的30天(60 * 60 * 24 * 30 = 2592000)不要通过HTTP连接,而是在之前自动将任何HTTP请求升级到HTTPS 你发送请求。"在Chrome中,您会在开发者工具中看到307互联网重定向。
为什么30天?好吧,它必须是可以安装的浏览器才有用,你可以决定多长时间。有些人推荐1年甚至2年(分别为31536000或63072000秒)。
您还可以指定includeSubDomains标头,以便子域名也会自动受到保护(尽管如果有人直接访问子域名,它们显然也会返回标题):
Strict-Transport-Security "max-age=2592000; includeSubDomains"
这对于更好地保护cookie是必要的,因为假子域可以获取或设置父域的cookie并劫持会话。但是,如果子域不在HTTPS上,则存在危险 - 这可能并不总是很明显。例如。如果您在内部使用主域名并且网站位于http://intranet.example.com,那么它可能会停止工作,直到您将其升级到HTTPS或更改策略并等待之前的最长时间到期为止。
这仍然存在风险,因为需要首先建立连接才能将此策略添加到浏览器缓存中。它是对首次使用(TOFU)政策的信任。同样,如果在获得保单后长时间访问,您处于相同的情况。因此,您可以将站点提交到预加载列表,以便浏览器将您的站点硬编码到其中,因此它始终假设已设置HSTS。使用此网站执行此操作:https://hstspreload.appspot.com。这听起来不错,但并非没有风险。将您的网站提交到此列表后,删除它几乎是不可能的,因此它基本上是对HTTPS的永久承诺。也许没什么坏事,但你还需要有一个很长的到期时间,includeSubDomains设置,还要添加预加载设置:
Strict-Transport-Security "max-age=2592000; includeSubDomains; preload"
就我个人而言,我认为这是一种过度杀伤,并且可能非常危险,因为它不受你的控制并且不容易逆转。恕我直言,只有高调的网站(网上银行,电子商务网站,谷歌,Facebook,Twitter ......等)应该打扰预加载,但这是你自己的选择。
我的博文更多信息: https://www.tunetheweb.com/security/http-security-headers/hsts/ https://www.tunetheweb.com/blog/dangerous-web-security-features/