将HTTP重定向到HTTPS还是拒绝使用HTTP?

3
配置Apache HTTPD服务器时,许多网络文章建议通过将(永久)重定向所有HTTP请求到HTTPS来强制执行HTTPS协议。
以下是我理解的当用户尝试访问支持HTTP和HTTPS的服务器时发生的情况:
1. 客户端用户代理(例如Web浏览器,但不仅限于此)向http://my.domain.com发送请求。 2. 服务器在端口80上接收请求,并将永久重定向(代码301)发送到https://my.domain.com。 3. 客户端用户代理接收响应。鉴于状态代码,它将相同的请求发送到https://my.domain.com。 4. 服务器在端口443上接收请求并发送所需内容。
因此,在步骤1和2之间,如果请求包含敏感数据,则中间人可能会恢复未加密的请求。
如果客户端使用Web浏览器,则此浏览器将缓存301重定向,并且下一次客户端使用HTTP发送请求时,它将自动改为使用HTTPS发送。但是,如果客户端经常清除缓存呢?或者使用另一个用户代理而不是Web浏览器,该用户代理不存储永久重定向?在这种情况下,我们不会失去HTTPS的好处吗?具体案例:REST API和请求包含敏感数据。此API可以从任何HTTP客户端(在线,嵌入软件或网站,独立)调用。在这种情况下,禁用服务器级别上的HTTP支持以强制使用HTTPS是否更好?

2
也许这会对你有所帮助:https://dev59.com/QG855IYBdhLWcg3wZzbf。 - Opal
2个回答

4
为了确保您的网站始终使用https进行安全访问,一种方法是启用HSTS

自动将引用Web应用程序的任何不安全链接转换为安全链接。

要启用它,您需要在vHost配置中添加一个头文件:
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains;"

请确保已启用头部模块。

您可以按照此处的说明添加您的域名以包含在Chrome的HTTP Strict Transport Security(HSTS)预加载列表中。

这是一个硬编码为仅支持HTTPS的站点列表。


HSTS提供的安全性仅取决于用户代理是否符合规范。SoapUI是否符合规范?(即,在发送请求之前,它是否会将协议转换为HTTPS,如规定的那样?)curl是否符合规范?或者任何请求工具... - Eria

2
"

完全禁用http会有帮助吗?"

很可能会有帮助。我要更新和更改我的2017年的回答,因为正如用户kamilz在下面的评论中指出的那样,我显然太仓促了,得出了错误的结论。引用kamilz的话:

如果目标服务器已知但不侦听端口80(或者端口80被阻塞),TCP握手将失败,数据也不会通过网络发送。如果它侦听80端口,则会接受TCP连接并以明文形式发送数据。

这当然是有道理的。那么为什么我可以在下面的图片中看到敏感数据呢?Kamilz也给出了解释:

Fiddler充当了一个Web代理,所以它能够看到原始请求。

这些数据还没有被发送 - 它们仍然存在于我的计算机上,并且尚未进行DNS查找。经过Fiddler后,DNS查找将会执行,但不会找到有效的IP地址1,因此没有有效的IP地址,就没有地方发送内容。

(也就是说,假设没有人注册带有我的拼写错误的 http://somefakeurlthatdoesnotexistanywhare.com 地址)



之前的错误答案

为了更好的理解,这是我的原始答案(说不定它甚至会给人以启示,帮助其他人避免犯同样的错误):

不,我认为不行,原因如下:你的客户端/浏览器在发送请求之前不知道是否存在一个运行http的站点。当然,它会收到像404或类似的错误代码,但此时原始请求已经通过电线发送出去了,任何“中间人”都可能已经能够观察到该请求。

作为问题的简单说明,这里有一个来自Postman的虚假http-url调用,并被Fiddler截获的例子。正如您所看到的,返回了502错误,但原始请求仍包含敏感数据。

enter image description here

现在只是为了比较,如果我做同样的事情,但只是将URL更改为https,那么在Fiddler中我会得到不同的结果:

enter image description here

这尝试建立一个隧道,并且不会透露任何后续数据。

因此,总的来说,您最好的选择可能是启用HSTS并将您的网站加入HSTS预加载列表,这应该可以阻止任何HTTP请求被发送(至少对于大多数主流浏览器的最新版本)。


我同意这不是公共网站的理想选择。但对于REST API,例如。您可以指定每个请求都必须使用HTTPS发送。因此,客户端将知道这一点。 是的,在第一个使用HTTP的请求中,攻击者可能会读取潜在的敏感数据。但如果我的前置Apache服务器将其重定向到HTTPS,那么用户会改变协议吗?没有。如果他收到错误,他将更正请求协议(特别是在自动请求工具(例如批处理脚本)的情况下)。 - Eria
对我来说,HSTS是一种很好的实践。我之前不知道它的存在,但我肯定会启用它。但是,我认为这还不够。 - Eria
1
@Eria 你说得没错,对于REST API来说,提供http版本的服务或重定向到https是没有意义的 - 最好只提供https。我的观点只是禁用http不会阻止客户端发送http请求。另一方面,HTSTS将确切地做到这一点 - 至少对于实现它的客户端来说。 - Kjartan
1
我认为这个答案不正确。至少提供的证据是错误的。Fiddler充当Web代理,这就是为什么它能够看到原始请求的原因。在所呈现的情况下发生的是DNS解析失败,因为目标未知,所以没有发送任何HTTP数据。 - kamilz
1
如果目标服务器已知但未在端口80上监听(或端口80被阻止),TCP握手应该会失败,仍然不会通过网络发送任何HTTP数据。如果它在80上监听,则会接受TCP连接并以明文形式发送数据。 - kamilz
1
@kamilz 谢谢,感谢您的反馈,即使已经过去了将近六年!:D 我引用了您的评论在我的修订答案中。 - Kjartan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接