sindrili(泉巨永乡SEO,防城区SEO那梭镇SEO)n的小巢

发布时间:2020-06-13 08:36 编辑:西极电力网

DNS劫持指在劫持的网络范围内拦截域名解析的请求,分析请求的域名,把审查范围以外的请求放行,否则返回假的IP地址或者什么都不做使请求失去响应。

sindrili(泉巨永乡SEO,防城区SEO那梭镇SEO)n的小巢

DNS劫持的主要表现为看视频,,点击之后莫名其妙的跳到了某些广告网站。正常情况下,当我们点击某个链接的时候,会向一个称作DNS服务器的东西发出请求,把链接转换成机器能够识别的ip地址,其过程如下:

sindrili(泉巨永乡SEO,防城区SEO那梭镇SEO)n的小巢

域名->ip地址的过程被称作DNS解析。在这个过程中,由于DNS请求报文是明文状态,可能会在请求过程中被监测,然后攻击者伪装DNS服务器向主机发送带有假ip地址的响应报文,从而使得主机访问到假的服务器。

sindrili(泉巨永乡SEO,防城区SEO那梭镇SEO)n的小巢

NSURLProtocol

NSURLProtocol是苹果提供给开发者的黑魔法之一,大部分的网络请求都能被它拦截并且篡改,以此来改变URL的加载行为。这使得我们不必改动网络请求的业务代码,也能在需要的时候改变请求的细节。作为一个抽象类,我们必须继承自NSURLProtocol才能实现中间攻击的功能。

是否要处理对应的请求。由于网页存在动态链接的可能性,简单的返回YES可能会创建大量的NSURLProtocol对象,因此我们需要保证每个请求能且仅能被返回一次YES

+ (BOOL)canInitWithRequest: (NSURLRequest *)request; + (BOOL)canInitWithTask: (NSURLSessionTask *)task;

是否要对请求进行重定向,或者修改请求头、域名等关键信息。返回一个新的NSURLRequest对象来定制业务

+ (NSURLRequest *)canonicalRequestForRequest: (NSURLRequest *)request;

如果处理请求返回了YES,那么下面两个回调对应请求开始和结束阶段。在这里可以标记请求对象已经被处理过

- (void)startLoading; - (void)stopLoading;

当发起网络请求的时候,系统会像注册过的NSURLProtocol发起询问,判断是否需要处理修改该请求,通过一下代码来注册你的子类

[NSURLProtocol registerClass: [CustomURLProtocol class]];

DNS解析

一般情况下,考虑DNS劫持大多发生在使用webView的时候。相较于使用网页,正常的网络请求即便被劫持了无非是返回错误的数据、或者干脆404,而且对付劫持,普通请求还有其他方案选择,所以本文讨论的是如何处理网页加载的劫持。

LocalDNS LocalDNS是一种常见的防劫持方案。简单来说,在网页发起请求的时候获取请求域名,然后在本地进行解析得到ip,返回一个直接访问网页ip地址的请求。结构体struct hostent用来表示地址信息:

struct hostent { char *h_name; // official name of host char **h_aliases; // alias list int h_addrtype; // host address type——AF_INET || AF_INET6 int h_length; // length of address char **h_addr_list; // list of addresses };

C函数gethostbyname使用递归查询的方式将传入的域名转换成struct hostent结构体,但是这个函数存在一个缺陷:由于采用递归方式查询域名,常常会发生超时。但是gethostbyname本身不支持超时处理,所以这个函数调用的时候放到操作队列中执行,并且采用信号量等待1.5秒查询:

+ (struct hostent *)getHostByName: (const char *)hostName { __block struct hostent * phost = NULL; dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); NSOperationQueue * queue = [NSOperationQueue new]; queue.maxConcurrentOperationCount = 1; [queue addOperationWithBlock: ^{ phost = gethostbyname(hostName); dispatch_semaphore_signal(semaphore); }]; dispatch_semaphore_wait(semaphore, dispatch_time(DISPATCH_TIME_NOW, 1.5 * NSEC_PER_SEC)); [queue cancelAllOperations]; return phost; }

然后通过函数inet_ntop把结构体中的地址信息符号化,获得C字符串类型的地址信息。提供getIpAddressFromHostName方法隐藏对ipv4和ipv6地址的处理细节:

+ (NSString *)getIpv4AddressFromHost: (NSString *)host { const char * hostName = host.UTF8String; struct hostent * phost = [self getHostByName: hostName]; if ( phost == NULL ) { return nil; } struct in_addr ip_addr; memcpy(&ip_addr, phost->h_addr_list[0], 4); char ip[20] = { 0 }; inet_ntop(AF_INET, &ip_addr, ip, sizeof(ip)); return [NSString stringWithUTF8String: ip]; } + (NSString *)getIpv6AddressFromHost: (NSString *)host { const char * hostName = host.UTF8String; struct hostent * phost = [self getHostByName: hostName]; if ( phost == NULL ) { return nil; } char ip[32] = { 0 }; char ** aliases; switch (phost->h_addrtype) { case AF_INET: case AF_INET6: { for (aliases = phost->h_addr_list; *aliases != NULL; aliases++) { NSString * ipAddress = [NSString stringWithUTF8String: inet_ntop(phost->h_addrtype, *aliases, ip, sizeof(ip))]; if (ipAddress) { return ipAddress; } } } break; default: break; } return nil; } + (NSString *)getIpAddressFromHostName: (NSString *)host { NSString * ipAddress = [self getIpv4AddressFromHost: host]; if (ipAddress == nil) { ipAddress = [self getIpv6AddressFromHost: host]; } return ipAddress; }

适配IPv6

苹果明确现在的的应用要支持IPv6地址,对于开发者来说,并没有太大的改动,无非是将gethostbyname改成另外一个函数:

phost = gethostbyname2(host, AF_INET6);

另外就是解析域名过程中优先获取IPv6的地址而不是IPv4:

TAG: seo优化代码 惠州seo外包 seo排名资讯 seo工作原理 超级seo外链工具 seo方式 合川seo 昆明seo公司 八禾seo 四川seo博客 seo文案类型 姜海seo 学seo 宾馆seo seo经理招聘 seo文案案例 免费网站seo诊断 开封seo seo唐勇 seo公关

上一篇:路由器DNS被恶意篡改劫持(王坪乡SEO,马上乡SEO)了怎么办?路由器dns如何设置? 下一篇:查看自己是(护潭乡SEO,罗山溪乡SEO)否被DNS劫持

相关阅读

精彩推荐