Strict Transport Security
HTTP Strict Transport Security 简称 HSTS
本文以 MDN 为参考
Strict-Transport-Security 响应头是一个让浏览器只与服务器通过 HTTPS 进行通信的安全特性。
语法
字段
说明
如果一个网站接受 HTTP 的请求并重定向至 HTTPS,在这种情况下用户可能通过 HTTP 直接访问,例如:用户输入 http://www.foo.com/ 或者只是 foo.com。
这为中间人攻击提供了便利,在用户连接 HTTP 时,中间人可以修改流量从而将用户重定向到伪造的网站。
HSTS 响应头可以让服务器通知浏览器永远不使用 HTTP 加载这个网站,所有的访问应该全部转换成 HTTPS。
注意
当浏览器使用 HTTP 加载你的网站时会忽略 Strict-Transport-Security 响应头,这是因为攻击者可以在 HTTP 连接时截取流量并注入或删除 header。
当浏览器使用 HTTPS 加载记得网站并且没有证书错误时,浏览器会知道你的网站可以使用 HTTPS 并且会对 Strict-Transport-Security 响应头进行处理。
一种示例情况
你在机场登录了一个免费 WiFi 并且开始上网,访问了你的银行服务并且查看了你的余额还进行了几次支付。很不幸的是,你连接的 WiFi 实际上是一个黑客的笔记本电脑,黑客开始截取你的原始 HTTP 流量并且将你重定向到了另外一个伪造的银行网站。现在你的隐私数据全都暴露给了黑客。
HSTS 解决了这个问题,只要你使用 HTTPS 访问过银行网站,并且银行的网站使用了 HSTS,那么你的浏览器就会知道只应该通过 HTTPS 访问,这防止了黑客进行这类的中间人攻击。
浏览器是怎样处理的
在网站第一次使用 HTTPS 进行连接并且服务器返回了 Strict-Transport-Security
响应头,浏览器会记录下这些信息,在以后尝试使用 HTTP 连接时,浏览器都会自动转换为 HTTPS 进行连接。
当超过 Strict-Transport-Security
响应头指定的有效时间后,下一个 HTTP 加载请求则会被正常处理,而不是使用 HTTPS。
无论 Strict-Transport-Security
响应头被何时传达到浏览器,浏览器都会更新有效时间,所以网站可以刷新这些信息以防 HSTS 信息过期。当 max-age
通过 HTTPS 连接被设置为 0 时,这个响应头会立即过期,从而允许 HTTP 访问。
预加载 HSTS
Google 维护了一个 HSTS 预加载服务需要科学上网。只要成功的提交了你的域名,浏览器将永远不会使用不安全的连接访问你的网站。因为这个服务是由 Google 维护的,所有的浏览器都会使用这一个预加载列表。
实例
所有现在和将来的子域名都会被强制使用 HTTPS 并且有效时间为 1 年。这会阻止所有只能通过 HTTP 访问的服务。
规范
规范 | 状态 | 解释 |
---|---|---|
HTTP Strict Transport Security (HSTS) | IETF RFC | 原始定义 |
兼容性
桌面系统
特性 | Chrome | Edge | FireFox | IE | Opera | Safari | Servo |
---|---|---|---|---|---|---|---|
Strict-Transport-Security | 4.0 | 12 | 4 | 11 | 12 | 7 | ? |
手机系统
特性 | Android | Chrome For Android | Edge Mobile | FireFox for Android | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|---|
Content-Security-Policy | 4.4 | 18 | (Yes) | (Yes) | ? | ? | 8.4 |
参考资料
- 博文:HTTP Strict Transport Security has landed!
- 博文:HTTP Strict Transport Security
- OWASP 文章:HTTP Strict Transport Security
- 维基百科:HTTP Strict Transport Security
(^o^)/~ 本文已完成