你觉得升级HTTPS就万事大吉了吗???

大部分同窗应该都知道 HTTP 协议的网站是不安全的,存在中间人劫持的状况,所以咱们日常开发的网页都会将 HTTP 协议升级为 HTTPS,以确保不会被中间人劫持。浏览器

注:本文不涉及 HTTPS 的实现原理以及中间人劫持的概念,不了解的同窗先去恶补缓存

但是大家觉得这样就绝对安全了吗?咱们想一想下面的场景:安全

一般状况下,咱们打开一个普通的网站多是经过如下几个方式:bash

  • 直接点击收藏栏
  • 经过搜索引擎找到
  • 直接输入域名

当采用 直接输入域名 的方式时,以下图所示: 服务器

这时候咱们并无告诉浏览器当前请求的网站协议是https,然而咱们最终打开的仍是 https 协议的百度网站。这是为何呢?

其实就是重定向帮咱们作了肉眼看不见的事情,具体流程见下图app

那么这个过程当中第一步就会涉及名文的传输,所以有了被中间人攻击的机会,因此咱们该如何避免这种状况的出现呢?答案就是本文须要介绍的 HSTS

HSTS

MDN 对 HSTS 的定义很是直白网站

HTTP Strict Transport Security(一般简称为HSTS)是一个安全功能,它告诉浏览器只能经过HTTPS访问当前资源,而不是HTTP搜索引擎

经过定义咱们能够画出下面这样的流程图spa

当发起 http 的请求,不通过服务器直接变成 HTTPS 将请求发出去。code

具体怎么才能让 HSTS 其做用呢?咱们接着看。

Strict-Transport-Security

经过给https协议的网站的response header配置Strict-Transport-Security

Strict-Transport-Security: max-age=<expire-time>; includeSubDomains(可选); preload(可选,非标准)
复制代码

每一个属性的定义以下:

  • max-age= -- 在浏览器收到这个请求后的秒的时间内有效。
  • -- 若是这个可选的参数被指定,那么说明此规则也适用于该网站的全部子域名。
  • preload -- 谷歌维护着一个 HSTS 预加载服务。按照指示成功提交你的域名后,浏览器将会永不使用非安全的方式链接到你的域名。虽然该服务是由谷歌提供的,但全部浏览器都有使用这份列表的意向(或者已经在用了)。可是,这不是 HSTS 标准的一部分,也不应被看成正式的内容。

咱们看到百度的网站也设置了Strict-Transport-Security。

表示在172800秒的时间内访问百度的主页都是以https的形式,不过他并无设置includeSubDomains这个属性。

细心的同窗可能发现了,有一种状况下仍是没办法避免中间人劫持。那就是,在用户第一次访问网站而且使用 http 协议的状况下,若是真要全面防止只能经过给域名添加 preload 的方式。具体方法请参加 MDN 添加preload

总结

有了上面的基础,让咱们总结一下三种首次访问的状况

  1. 没有HSTS

    1. 浏览器发起http请求
    2. 服务端重定向到https
    3. 浏览器发起https请求
  2. 有HSTS,没有preload

    1. 浏览器发起http请求
    2. 服务端重定向到https
    3. 浏览器发起https请求
    4. 服务器收到https请求,返回数据的同时会添加 strict-transport-security的header,配置参见上文。每次https请求都会刷新这个过时时间。
  3. 有HSTS以及preload(最佳实践)

    1. 浏览器发起http请求
    2. 因为存在preload,浏览器会主动将连接升级为https。

最后咱们应该注意,在生产环境下使用 HSTS 应当特别谨慎,由于一旦浏览器接收到HSTS Header(假若有效期是1年),可是网站的证书又刚好出了问题,那么用户将在接下来的1年时间内都没法访问到该网站,直到证书错误被修复,或者用户主动清除浏览器缓存。

相关文章
相关标签/搜索