计算机教程

必赢娱乐棋牌你所不知道的 HSTS

26 3月 , 2019  

你所不知道的 HSTS

2015/10/24 · HTML5 ·
HSTS

原文出处:
李靖(@Barret李靖)   

很多人听说过也看到过 301、302,但是几乎从来没有看到过 303 和 307
的状态码。今天在淘宝首页看到了 307 状态码,于是摸索了一把。

最近对我的个人网站启用了Https,所以想设置http默认自动转https访问的功能,但又不想总让服务端做转发操作,那样浪费资源。那么有什么好的办法呢?

中间人劫持

起因是这样,https 使用的是 443 端口进行数据传输,而浏览器的默认端口是

  1. 劫持者首先劫持用户的 80
    端口,当用户向目标页发起请求时,劫持者模拟正常的 https
    请求向源服务器获取数据,然后通过 80
    端口返回给用户,大概可以看下下面两张图:

必赢娱乐棋牌 1

用户一般不会在地址栏输入  https://www.taobao.com ,而是习惯性输入
taobao.com  ,此时浏览器走的是
http,请求到达服务器之后,服务器告诉浏览器 302 跳转

Location: https://www.taobao.com

1
Location: https://www.taobao.com

然后浏览器重新请求,通过 HTTPS 方式,443
端口通讯。而正因为用户不是直接输入 https:// 链接,劫持者利用这一点:

必赢娱乐棋牌 2

只要能够劫持你的网络,比如路由劫持、DNS劫持,就可以作为中间人注入代码、替换广告。。。(上了
https 也拗不过电信,真是日了够了)

这种劫持出现在两种情况下:

  • 用户没有通过准确的方式访问页面,除非输入 https:// ,否则浏览器默认以 http 方式访问
  • HTTPS 页面的链接中包含 http,这个 http 页面可能被劫持

302跳转

通常将 HTTP 请求 302 跳转到 HTTPS,但有问题:

1.不安全,302 跳转会暴露用户访问站点,易被劫持。

2.多增加一次访问,使得客户端响应速度慢。302 跳转需要一个 RTT(The role
of packet loss and round-trip time),浏览器执行跳转也需要时间。

启用 HSTS

HSTS,HTTP Strict Transport
Security,简单说就是强制客户端使用 HTTPS 访问页面。其原理就是:

  • 在服务器响应头中添加  Strict-Transport-Security ,可以设置  max-age
  • 用户访问时,服务器种下这个头
  • 下次如果使用 http 访问,只要 max-age
    未过期,客户端会进行内部跳转,可以看到 307 Redirect Internel
    的响应码
  • 变成 https 访问源服务器

这个过程有效避免了中间人对 80
端口的劫持。但是这里存在一个问题:如果用户在劫持状态,并且没有访问过源服务器,那么源服务器是没有办法给客户端种下
Strict-Transport-Security  响应头的(都被中间人挡下来了)。

启用 HSTS 不仅仅可以有效防范中间人攻击,同时也为浏览器节省来一次 302/301
的跳转请求,收益还是很高的。我们的很多页面,难以避免地出现 http
的链接,比如 help 中的链接、运营填写的链接等,这些链接的请求都会经历一次
302,对于用户也是一样,收藏夹中的链接保存的可能也是 http 的。

HSTS

302 跳转是由浏览器触发的,服务器无法完全控制,这个需求导致了 HSTS(HTTP
Strict Transport Security)的诞生。HTSP 就是添加 header 头(add_header
Strict-Transport-Security
max-age=15768000;includeSubDomains),告诉浏览器网站使用 HTTPS
访问,支持HSTS的浏览器就会在后面的请求中直接切换到 HTTPS。在 Chrome
中会看到浏览器自己会有个 307 Internal Redirect
的内部重定向。在一段时间内也就是max-age定义的时间,不管用户输入
www.liberalman.cn
还是
http://www.liberalman.cn
,都会默认将请求内部跳转到https://www.liberalman.cn

采用HSTS协议的网站将保证浏览器始终连接到该网站的HTTPS加密版本,不需要用户手动在URL地址栏中输入加密地址。

该协议将帮助网站采用全局加密,用户看到的就是该网站的安全版本。

HSTS的作用是强制客户端(如浏览器)使用HTTPS与服务器创建连接。服务器开启HSTS的方法是,当客户端通过HTTPS发出请求时,在服务器返回的超文本传输协议响应头中包含Strict-Transport-Security字段。非加密传输时设置的HSTS字段无效。

比如,https://www.liberalman.cn
的响应头含有Strict-Transport-Security: max-age=31536000;
includeSubDomains。这意味着两点:
在接下来的一年(即31536000秒)中,浏览器只要向xxx或其子域名发送HTTP请求时,必须采用HTTPS来发起连接。比如,用户点击超链接或在地址栏输入
http://www.liberalman.cn/
,浏览器应当自动将 http 转写成 https,然后直接向
https://www.liberalman.cn/
发送请求。

在接下来的一年中,如果
www.liberalman.cn
服务器发送的TLS证书无效,用户不能忽略浏览器警告继续访问网站。

服务器端配置HSTS,减少302跳转,其实HSTS的最大作用是防止302
HTTP劫持。HSTS的缺点是浏览器支持率不高,另外配置HSTS后HTTPS很难实时降级成HTTP。同时,也建议启用SPDY来提高性能,不累述。


相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图