如果我使用HTTP http://example.com
请求我们的网站,则响应为301 Moved Permanently
,且Location
标头设置为https://example.com
-当然,由于MIM,这是不安全的攻击。
是否有一种方法只是向浏览器做出响应,例如“再次发出相同的请求,但这次是通过HTTPS”,目的是明确告诉浏览器URL?
我原本希望在Troy Hunt的blog post上找到这种解决方案,但是唯一的建议是使用我们不想做的HSTS预加载(即在Google上注册我们的网站)。
答案 0 :(得分:1)
HTTP严格传输安全性(HSTS)允许您发送HTTP标头,说“下次使用此域-即使用户键入http://或使用以http:开头的链接,也要确保该域通过HTTPS。 //”。
在Apache中,使用以下配置进行设置:
Header always set Strict-Transport-Security "max-age=60;"
这会发送一条消息,告诉浏览器记住该标头60秒钟。确认没有问题时,应增加此值。通常建议设置为63072000(2年)。
因此,它比重定向更安全,因为它自动发生而无需发送不安全的HTTP请求,该请求可以在不安全的网络上被拦截,读取甚至更改。
例如,假设您以前通过家庭WiFi登录到网上银行,浏览器记住了HSTS设置,然后您访问了当地的咖啡店。在这里,您尝试连接到免费WiFi,但实际上是连接到黑客WiFi。如果您使用HTTP链接,书签或通过键入URL进入网上银行,则HSTS将启动,您将立即通过HTTPS进行访问,黑客无法(在合理范围内)对流量进行解密。
所以。一切都很好。您还可以添加includeSubDomains
属性:
Header always set Strict-Transport-Security "max-age= 63072000; includeSubDomains"
这增加了额外的安全性。
HSTS的一个缺陷是它要求初始连接来加载此HTTP标头并在将来保护您。在max-age
时间之后它也会超时。这就是预加载的地方。您可以将域提交给浏览器,浏览器会将域的HSTS设置加载到浏览器代码中,并将其永久保存,从而确保首次连接都是安全的。
但是I really don’t like preload to be honest。我只是发现事实超出了您的控制范围,很危险。因此,如果您发现某个域未使用HTTPS(例如http://blog.example.com或http://intranet.example.com或http://dev.example.com),则一旦预加载生效-BANG,您就强迫自己升级它们,很快,因为直到那时它们都无法访问。从浏览器撤消至少需要几个月的时间,并且很少有人可以忍受这种停机时间。当然,您应该对此进行测试,但这需要转到https://example.com(而不是https://www.example.com)并使用includeSubDomains
来完全复制预加载将执行的操作,而并非每个人都这样做。有many, many examples of sites getting this wrong。
您还必须问自己在防范什么以及暴露给自己的风险是什么?通过http://链接,黑客拦截程序可以访问cookie(该站点可以通过使用cookie上的secure
属性来防止该访问),并可能通过使您保持http://而不是升级来拦截流量。到https://(主要通过HSTS和is increasingly flagged by the browser anyway缓解)。请记住,即使在攻击者的WiFi网络上,绿色的挂锁也意味着连接是安全的(在合理的限制内)。因此,只要您为此寻找(并且您的用户也这样做,我承认这比较困难),风险就相当小。这就是为什么迁移到所有地方的HTTPS,然后默认使用HTTPS如此重要的原因。因此,对于大多数网站,我认为没有预加载的HSTS就足够了,而将控制权留给了网站所有者。