前言

iOS小技能:请求安全防护_.net

银行和信用卡类app 为了安全,防止修改和抓包都是基本的要求。

  • 防止抓包
  1. 防代理
  2. 【SSL证书验证(采用AFNetwork)】

经过app的SSL证书验证之后,别人无法获取报文,除非服务器的证书信任Charles的证书


  • 防止修改请求和返回数据 【iOS app侧对请求参数进行签名:【请求参数按照ASCII码从小到大排序、拼接、加密】(递归的方式进行实现)】


本文重点:

  1. 防代理分析请求数据
  2. SSL证书认证
  3. 采用签名禁止修改报文
  4. 不在本地缓存网络请求报文
  5. 利用NSURLProtocol 拦截修改请求

I 防止抓包

1.1 防代理

#pragma mark ——— 防代理
- (BOOL)getProxyStatusWithURL:(NSString *)url {
    NSDictionary *proxySettings =  (__bridge_transfer NSDictionary *)(CFNetworkCopySystemProxySettings());
    NSArray *proxies = (__bridge_transfer NSArray *)(CFNetworkCopyProxiesForURL((__bridge CFURLRef _Nonnull)([NSURL URLWithString:url]), (__bridge CFDictionaryRef _Nonnull)(proxySettings)));
    NSDictionary *settings = [proxies objectAtIndex:0];

    NSLog(@"host=%@", [settings objectForKey:(NSString *)kCFProxyHostNameKey]);
    NSLog(@"port=%@", [settings objectForKey:(NSString *)kCFProxyPortNumberKey]);
    NSLog(@"type=%@", [settings objectForKey:(NSString *)kCFProxyTypeKey]);
    //2019-10-11 22:28:29.993974+0800 ShopList[5912:810446] type=kCFProxyTypeHTTPS

    if ([[settings objectForKey:(NSString *)kCFProxyTypeKey] isEqualToString:@"kCFProxyTypeNone"]){
        //没有设置代理
        return NO;
    }else{
        //设置代理了
        return YES;
    }
}

1.2 app的SSL证书验证(AFNetworking证书认证)

-【 经过app的SSL证书验证之后,就是这样子,别人无法获取报文,除非服务器的证书信任Charles的证书】

[AFHTTPSessionManager manager].securityPolicy = [self customSecurityPolicyWithCertName:@"myCer2020"];
//设定安全策略未读取指定证书文件进行证书验证

AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
//进行SSL证书认证

II 防止修改请求和返回数据

2.1 对请求参数进行签名

【iOS app侧对请求参数进行签名:【请求参数按照ASCII码从小到大排序、拼接、加密】(递归的方式进行实现)】

2.2 不在本地缓存网络请求报文

设置网络请求缓存策略,不在本地缓存网络请求报文

NSURLRequestReloadIgnoringLocalCacheData
NSURLRequestReloadIgnoringCacheData

connection willCacheResponse{
    return nil;
}

III 利用NSURLProtocol 拦截请求

3.1 写一个tweak ,修改请求的HTTPHeaderField

完整的源码请关注公号:iOS逆向:利用NSURLProtocol 拦截 UIURLConnection、NSURLSession的请求,进行HTTPHeaderField的修改

3.2 基于NSURLProtocol实现iOS应用底层所有网络请求拦截

  • 基于NSURLProtocol实现iOS应用底层所有网络请求拦截(含网页ajax请求拦截【不支持WKWebView】);

RequestBlock4NSURLProtocol 应用场景:隧道APP请求我们自己接口的都不走隧道、修改请求的HTTPHeaderField,设置代理IP和端口、防抓包(使Thor,Charles,Burp等代理抓包方式全部失效)


3.3 iOS APP 不走全局proxy的方案

iOS APP 不走全局proxy的方案【 例如:隧道APP的请求接口,一些自己特殊接口不走隧道】(利用NSURLProtocol 进行请求的拦截)


防抓包原理

//APP请求我们自己接口的都不走隧道
    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration ephemeralSessionConfiguration];
    configuration.connectionProxyDictionary = @{};