HTTPS的最佳实践

2015-09-09, 发表于【行业常识】

随着移动互联网的流行,越来越多的客户端会使用WIFI上网,无论是自己搭建的WIFI还是咖啡馆或机场的WIFI甚至是盗用邻居家的WIFI。然而,随着越来越多的设备使用WIFI上网,普通HTTP网站的安全问题就凸显出来了。

想象一下,你在咖啡厅打开一个网页,输入帐号和密码登陆一个使用HTTP链接的网站,这时你的帐户和密码可能被人窃取到了。

为什么要使用HTTPS?

简单的说,HTTP连接是更容易被嗅探和遭受中间人攻击

如何识别HTTPS连接是否安全

下面以Chrome浏览器为例,介绍一下不同连接的图标代表的意义。

  • 普通的HTTP连接:
  • 安全的HTTPS连接:
  • 带黄色三角号警告的安全HTTPS连接:
  • 存在风险的带红叉HTTPS连接:

上面这四种图标很容易理解。前两种一个是非加密的HTTP连接,一个是加密了的HTTPS连接。

后两种都是HTTPS连接,但是因为Mixed Content或证书设置问题,存在潜在的安全隐患。

带黄色三角的表示在HTTPS页面里混入了HTTP连接的图片或CSS资源。带来的潜在安全隐患就是:

  1. 这些图片或CSS可以被中间人篡改影响网站的外观。
  2. 经过非HTTPS连接发送的Cookie可能被获取。

而带红X图标的问题就大了,说明可能是HTTPS页面里混入了HTTP连接的Javascript资源。潜在的安全隐患就是:

  1. 通过HTTP传输的Javascript可能受到中间人攻击,JS内容被篡改之后在页面执行,获取用户输入的敏感信息。
  2. 同样,经过HTTP连接发送的Cookie可以被获取。

顺便说一下,关于cookie从HTTP链接泄露问题,解决办法是使用Secure Cookie

Mixed Content问题

从上面可以得出结论,即使网站使用了HTTPS协议,也未必安全。常见的错误就是出现Mixed Content问题。简单的说,就是一个HTTPS页面里即存在HTTP资源又存在HTTPS资源。当然,如果HTTP资源是图片或CSS危险会小一点, 因为受浏览器安全策略影响,即使CSS或图片被攻击者篡改了,也做不了什么特别危险的动作,而Javascript就不一样了。

想要避免Mixed Content,就是需要把整个页面内容都使用HTTPS连接。所以现在云存储或第三方服务都提供HTTPS连接。不提高的说明已经落伍了。

如何调试HTTPS问题

一般通过浏览器上面的图标就可以看出网站是否有Mixed Content问题。但是,即使网站显示绿锁图标也不能证明它不存在Mixed Content。这是因为一些高级浏览器会有Minxed Content Blocking功能,比如Chrome和Firefox 23。
这里有一个例子,其实是很严重的Mixed Content漏洞,但是由于浏览器给那个JS屏蔽掉了,浏览器就没有显示红X,而这段JS却没有被加载:https://code.csdn.net/CSDN_Code/code_support/issues/451

mixed content blocking

所以Chrome Console是神器,只需要在控制台看warning就可以,把被blocked和insecure的换成HTTPS连接。

How Github Remove Yellow Warning

我们知道Github是全站HTTPS的,但是Github还有一个特性是允许用户通过Markdown语法插入站外图片。如果插入的站外图片是HTTP的,那么在这个页面上就是会显示Mixed Content警告:

yello warning

为了移除这个黄色的warning,他们做了一个图片代理。把用户输入的图片地址替换,然后抓取到自己的HTTPS服务器上…具体的技术细节请看下面的几个连接: