最近遇到了一个关于网络劫持的问题,简单来说,是客户端访问阿里云主机,以及客户端从阿里云存储上进行下载的时候,出现的数据异常问题。
现象就是,例如我访问一个阿里云主机上的接口,接口有的时候返回的值不是我想要的值,比如说一堆乱码,还有从云存储上下载一个APK文件,下载下来之后,发现apk的大小没有发生变化,但是比较二进制文件,却发现有的地方是不一样的。
定位原因定位了一天左右,期间使用了不同的网络、路由、客户端设备,最终也只能定位到是劫持问题,具体是哪一种劫持,还不是十分清楚,所以紧接着就使用了排除法,首先判断是不是DNS劫持,连续更换了几个DNS,并进行了大批量的测试,排除了DNS劫持的问题,最后猜测可能是ISP劫持。
这个时候想要动服务提供商基本是不可能的了,所以只能从应用层面上进行问题的处理了,方案如下:
方案一:
最快,也是最方便的,是将所有的http协议访问的接口以及下载链全都替换成为https的。
方案二:
如果服务端不能进行操作,也就是说后台不属于自己的管辖范围,并且也没有权限处理后台的更改,那么就需要对被劫持的数据进行纠错处理了;对于云主机上的接口访问,当被劫持的数据到达客户端之后,客户端会收到很长一串乱码数据,长度是接口能返回数据的最大长度,所以可以根据接口返回数据的长度对数据进行正确的校验,如果正确,就不做处理了,如果错误,就重新访问接口,直到获取正确的数据。对于云存储,解决方案有很多,可以将上传的文件都打包成zip压缩包,客户端下载后,进行解压缩的时候,出错就意味着压缩包有问题,我们的数据有一部分是错误的,需要重新下载,或者每个文件在上传到云存储上的时候,另外上传一份MD5值,客户端下载完文件后,进行完整性校验。
这次问题的爆发有一个特点,就是区域性非常明显,长春地区大规模爆发,最后估计应该是ISP劫持,给服务提供商加了推广进来,为了验证,我用浏览器快速建立下载链接,果然,有一定几率下载链接会指向某公司的手机助手apk,坑!