******科普**
1、DNS劫持的危害
不知道大家有没有发现这样一个现象,在打开一些网页的时候会弹出一些与所浏览网页不相关的内容比如这样奇(se)怪(qing)的东西
或者这样
2、什么是DNS解析
现在假如我们访问一个网站www.baidu.com从按下回车到百度页面显示到我们的电脑上会经历如下几个步骤
- 1:计算机会向我们的运营商(移动、电信、联通等)发出打开www.baidu.com的请求。
- 2:运营商收到请求后会到自己的DNS服务器中找www.baidu.com这个域名所对应的服务器的IP地址(也就是百度的服务器的IP地址),这里比如是180.149.132.47。
- 3:运营商用第二步得到的IP地址去找到百度的服务器请求得到数据后返回给我们。
其中第二步就是我们所说的DNS解析过程,域名和IP地址的关系其实就是我们的身份证号和姓名的关系,都是来标记一个人或者是一个网站的,只是IP地址\身份证号只是一串没有意义的数字,辨识度低,又不好记,所以就会在IP上加上一个域名以便区分,或是做的更加个性化,但是如果真的要来准确的区分还是要靠身份证号码或者是IP的,所以DNS解析就应运而生了。
3:什么是DNS劫持
DNS劫持,是指在DNS解析过程中拦截域名解析的请求,然后做一些自己的处理,比如返回假的IP地址或者什么都不做使请求失去响应,其效果就是对特定的网络不能反应或访问的是假网址。根本原因就是以下两点:
- 1:恶意攻击,拦截运营商的解析过程,把自己的非法东西嵌入其中。
- 2:运营商为了利益或者一些其他的因素,允许一些第三方在自己的链接里打打广告之类的。
4:防止DNS劫持
了解了DNS劫持的相关资料后我们就知道了,防止NDS劫持就要从第二步入手,因为DNS解析过程是运营商来操作的,我们不能去干涉他们,不然我们也就成了劫持者了,所以我们要做的就是在我们请求之前对我们的请求链接做一些修改,将我们原本的请求链接www.baidu.com 修改为180.149.132.47,然后请求出去,这样的话就运营商在拿到我们的请求后发现我们直接用的就是IP地址就会直接给我们放行,而不会去走他自己DNS解析了,也就是说我们把运营商要做的事情自己先做好了。不走他的DNS解析也就不会存在DNS被劫持的问题,从根本是解决了。
******技术篇**
5:项目中的实际操作
5.1:DNSPOD相关
我们知道要要把项目中请求的接口替换成成IP其实很简单,URL是字符串,域名替换IP,无非就是一个字符串替换而已,的确这块其实没有什么技术含量,而且现在像阿里云(没开源),七牛云(开源),等一些比较大的平台在这方面也都有了比较成熟的解决方案,一个SDK,传个普通的URL进去就会返回一个域名被替换成IP的URL出来,也比较好用,这里要说一下IP地址的来源,如何拿到一个域名所对应的IP呢?这里就是需要用到另一个服务——HTTPDNS,国内比较有名的就是DNSPOD,包括阿里,七牛等也是使用他们的DNS服务来解析,就是这个
他会给我们提供一个接口,我们使用HTTP请求的方式去请求这个接口,参数带上我们的域名,他们就会把域名对应的IP列表返回回来。类似这样:
///这个请求URL的结构是固定的119.29.29.29是DNSPOD固定的服务器地址,ttl参数的意思是返回结果是否带ttl是个BOOL,dn就是我们需要解析的域名,id就是我们在dnspod上注册时候他给我们的一个KEY NSString *url = [NSString stringWithFormat:@"http://119.29.29.29/d?ttl=1&dn=www.baidu.com&id=KEY"]; NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10]; NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&networkError];
这里使用同步还是异步都是可以的,具体根据你们业务需求。
5.2:项目中的使用
NSURLProtocol属于iOS黑魔法的一种可以拦截任何从APP的 URL Loading System系统中发出的请求,其中包括如下
- File Transfer Protocol (ftp://)
- Hypertext Transfer Protocol (http://)
- Hypertext Transfer Protocol with encryption (https://)
- Local file URLs (file:///)
- Data URLs (data://)
相关使用应用请看之前博客