安全补脑 - 开启 HSTS 协议让你的站点更加安全

swift 发布于 2021年07月24日
什么是 HSTS

它的全称是 - HTTP Strict Transport Security。听起来挺高大上把,其实它特别简单,也已经被主流的浏览器广泛采用。先说说它能干什么吧, 简单来说支持 HSTS 的服务端,可以强制访问它的浏览器使用 HTTPS 协议。 这样就可以最大限度的减少 HTTP 协议的各种安全问题了。

如何实现

HSTS 的实现也很简单,通过 HTTPS 协议访问你站点的时候,在相应头中加上这样一段信息:

Strict-Transport-Security "max-age=63072000; includeSubdomains;"

Strict-Transport-Security 是 Header 字段名, 后面的 max-age 代表 HSTS 在客户端的生效时间。 includeSubdomains 表示对所有子域名生效。

举个例子, 我们在 Chrome 浏览器中访问 Facebook 的主页 https://facebook.com, 然后打开开发者工具,可以看到服务端发送这样的相应:

这里面的 Strict-Transport-Security 头就是 HSTS 的信息了。 其实在服务端上,只需要发送这个头就可以了。具体的实现都在客户端上,也就是你的浏览器。 当浏览器检测到这样的 Header 信息后,就会做一个记录,根据 max-age 的提示,在一定时间内用户再次访问这个站点的时候就直接使用 HTTPS 协议请求,如果 HTTPS 请求失败,也不会降级到 HTTP 而是直接失败。

这样有什么好处

其实大家平时在使用浏览器的时候,一般是直接在地址栏里面输入域名,然后就访问了。 但大家应该知道,大多数浏览器在默认情况下会先用 HTTP 发起请求的。也就是说即便你的站点已经支持了 HTTPS,但如果不做任何处理的话,用户还是很难触及到。

而为什么我们平时访问很多网站的时候自动就跳转到 HTTPS 站点了呢,也是因为这些站点对这一点做了处理。 最原始的方法就是 302 跳转,服务端把所有的 HTTP 流量跳转到 HTTPS 上。 但这样做有一个明显的安全漏洞, 就是第一次访问站点的时候如果是 HTTP 就有可能被中间人劫持,很可能都没到 302 跳转的时候就被劫持了。

这也就是为什么要引入 HSTS 机制的原因了。 用户的浏览器一旦得到了 HSTS 的信息,下次再访问站点的时候客户端浏览器就会强制使用 HTTPS。 无论你在地址栏里输入什么,都会以 HTTPS 访问。 这样就避免了每次服务端跳转可能导致的潜在安全问题。

这样就解释了为什么我们使用主流浏览器输入网站域名的时候,都会自动跳转到 HTTPS 了。 因为我们访问的大多是主流的大网站,所以用户的感觉就是 HTTPS 自动发生了。但实际上并不是这样的。

HSTS 本身也有缺陷,假如用户的浏览器从未访问过这个站点,那也就不会得到 HSTS 响应头, 这个时候依然会有被劫持风险, 但相比每次都进行服务端跳转的机制,已经好了不少。

针对 HSTS 的这个缺陷,主流的浏览器也提供了一些解决方案,比如把一些大流量并且已知支持 HSTS 的站点预先内置到浏览器中,这样就更大程度的完善了 HTTPS 的安全机制。

结束

HTTPS 可以帮助用户保护自己的信息传输安全,但这一切的达成还需要客户端于服务端的共同配合。合理使用 HSTS 可以让你的 HTTPS 站点触及更多的用户,当然 HSTS 也有它自身的缺陷,并且还有一点要注意的,就是如果你的站点的 HTTPS 服务没有完全准备好,不要轻易的开启 HSTS 响应头。因为一旦浏览器得到这个响应头,就会在规定的 max-age 的时间段内强制使用 HTTPS 访问,如果你的服务没准备好,用户就会一直访问失败,并且不能降级。

关于 HSTS 的文档可以查看 RFC 的定义 https://tools.ietf.org/html/rfc6797


如果你觉得这篇文章有帮助,还可以关注微信公众号 swift-cafe,会有更多我的原创内容分享给你~

本站文章均为原创内容,如需转载请注明出处,谢谢。
关注微信公众号
发现更多精彩
swift-cafe