Strict Transport Security

2017-02-11 00:21 #旧文章

HTTP Strict Transport Security 简称 HSTS

本文以 MDN 为参考

Strict-Transport-Security 响应头是一个让浏览器只与服务器通过 HTTPS 进行通信的安全特性。

语法

Strict-Transport-Security: max-age=<expire-time>
Strict-Transport-Security: max-age=<expire-time>; includeSubDomains
Strict-Transport-Security: max-age=<expire-time>; preload

字段

max-age=<expire-time>
以秒作为单位,浏览器记住这个站点只能通过HTTPS访问的时长。
includeSubDomains 可选
这是一个可选字段,这个规则是否应该被所有子域名所使用。
preload 可选
这是一个可选字段。详见下文『预加载HSTS』。

说明

如果一个网站接受 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 访问的服务。

Strict-Transport-Security: max-age=31536000; includeSubDomains

规范

规范状态解释
HTTP Strict Transport Security (HSTS) IETF RFC原始定义

兼容性

桌面系统

特性ChromeEdgeFireFoxIEOperaSafariServo
Strict-Transport-Security4.012411127?

手机系统

特性AndroidChrome For AndroidEdge MobileFireFox for AndroidIE MobileOpera MobileSafari Mobile
Content-Security-Policy4.418(Yes)(Yes)??8.4

参考资料

(^o^)/~ 本文已完成