前言
近期客户端为了缩包,对很多项目进行了h5化相关的工作,但在上线后发现有部分内容被http内容劫持
,具体现象就是部分页面被植入广告,由于之前大多采用http协议,被劫持肯定是束手无策,因此准备切换协议,而https多了关于域名证书验证与交互数据加密的步骤,之前也有对过https交互原理以及Charles抓包工具的原理做过相关学习总结,详见 https原理初探。
https是建立于http的基础上,加上了ssl(Secure Sockets Layer安全套接层)协议的网络传输协议,其中通过数字证书、对称与非对称加密、数据完整性摘要等技术,完成数据传输的保密性、完整性。而我们使用https就能完全应对网络安全中的dns劫持
和http内容劫持
吗?
正文
dns劫持、http内容劫持
dns劫持
由于我们在浏览器或webapp中与服务端的交互大多是通过协议+域名进行的,而对于域名映射到ip这个步骤要经过本机请求dns服务器的过程,因此除了受信任的dns根服务器,中间缓存的各种dns服务器都有可能被黑或者被运营商利用篡改,比如www.baidu.com正常是映射到61.135.169.125这个公网ip,黑客或者恶意份子将dns服务器对于该域名的公网ip解析改成26.135.169.123,那么我们在某个地域访问www.baidu.com得到的结果就是26.135.169.123这台服务器返回的内容,并且在http协议访问的情况下毫无感知。
http内容劫持
相对dns劫持,http内容劫持就没有那么直接暴力了,单独的http内容劫持不会篡改对应网页的服务器ip地址,而是会对网页返回的内容进行篡改,如访问www.baidu.com,本来应该得到的就是正常的百度首页,但是却出现了广告弹窗,这就是webapp或者浏览器通过http协议访问后,被恶意份子在数据返回中增加了网页的弹窗数据导致,而我们当前遇到的就是这个问题,针对内容劫持,http协议由于缺少对于数据的完整性验证,也没有办法应对。
两种劫持的结果,用通俗的话来说就是这样,我们想打车去超市买瓶可乐,dns劫持出租车将我们拉到了加油站;http内容劫持把我们拉到了超市,在我们拿到可乐前往里面添加了其他不想要的东西。
https对于劫持的效果
对于http协议来说,根据我们前面的结论两种劫持方式都不能得到有效的应对方式,而如果我们对相应域名及服务上了https协议呢?如test-h5.com被运营商或其他恶意份子将dns篡改至广告服务器地址F,浏览器使用https协议在与test-h5.com进行数据交互之前,需要获取域名对应证书,此时地址F的服务器返回一个假的证书,接着向CA或者本地跟证书验证对应域名证书合法性,浏览器必然会显示证书安全有问题,此时用户如果点击信任该证书并且继续浏览,则便进入了被劫持的h5页面。但这个安全提示还是可以有效的抑制对https域名的dns劫持。
而http内容劫持,由于https数据交互存在两端交互数据摘要的hash校验,如果内容校验不一直便会报错,因此https可以完全解决 恶意针对某个域名下返回数据增加广告弹窗等http的内容劫持,但也无法避免恶意份子直接伪造证书、接口数据等方式的dns+内容双重劫持,这种情况下只要用户选择信任该证书依旧会导致问题出现。非全站https
从上述所说的在https场景下劫持后的效果,可以看出当前对于浏览器、webapp中访问https域名的网页可以有效抵抗劫持,但如果是非全站的https(如图片、js引用、文本等url,整个网站中存在非https的站点),依旧会在浏览器上显示并不友好的提示,比如chrome会提示 此网页正试图从未经验证的来源加载脚本,左边的https也会被警告,因此建立全站https还是挺有必要的。非全站https也不仅只是在单独一个页面中所有元素的都是https,整个网站中如果存在非http站点,在http向https站点跳转时,恶意份子也可以通过xss注入修改页面元素,使用户无法通过https访问对应站点。
http改https会遇到的问题
本次改动设计到大量h5化的客户端协议改造,跨域也是一个较大的问题,比如对于一个文件,www.cloudlearn.speiyou.com/test.img,这个文件之前的跨域访问规则是允许http协议的客户端访问(如Access-Control-Allow-Origin: test-h5.com),在客户端的webapp承载页改成https(test-h5.com)之后,之前的http协议允许的跨域规则便无法通过,这就跟跨域规则限制三元组有关系了(协议、域名、端口),因此还需要配合增加https的跨域。
为了保证在之后不再出现http转https的情况,我们可以在后续开发新项目、域名时对应的服务仅支持https协议,即80端口不开放,仅开放443的https端口。
总结
简要概述了https原理、dns劫持、http内容劫持的现象及原理,并且在引入https后能否完全避免这两种劫持也在相应场景下作了探讨,毕竟https是保证的数据加密传输,虽无法完全避免这些劫持现象,但在数据加密的基础上也可以有效的减少被劫持的不安全现象,因此尽量采用https作为应用层协议还是必要的。