广告
返回顶部
首页 > 资讯 > 移动开发 >详解IOS如何防止抓包
  • 773
分享到

详解IOS如何防止抓包

IOS防止抓包 2022-05-30 15:05:43 773人浏览 安东尼
摘要

目录抓包原理防止抓包一、发起请求之前判断是否存在代理,存在代理就直接返回,请求失败。二、我们可以在请求配置中清空代理,让请求不走代理SSL Pinning(AFN+SSL Pinni

抓包原理

其实原理很是简单:一般抓包都是通过代理服务来冒充你的服务器,客户端真正交互的是这个假冒的代理服务,这个假冒的服务再和我们真正的服务交互,这个代理就是一个中间者 ,我们所有的数据都会通过这个中间者,所以我们的数据就会被抓取。https 也同样会被这个中间者伪造的证书来获取我们加密的数据。

防止抓包

为了数据的更安全,那么我们如何来防止被抓包。

第一种思路是:如果我们能判断是否有代理,有代理那么就存在风险。

第二种思路:针对HttpS 请求。我们判断证书的合法性。

第一种方式的实现:

一、发起请求之前判断是否存在代理,存在代理就直接返回,请求失败。


CFDictionaryRef dicRef = CFNetworkCopySystemProxySettings();
CFStringRef proxyStr = CFDictionaryGetValue(dicRef, kCFNetworkProxiesHTTPProxy);
NSString *proxy = (__bridge NSString *)(proxyStr);

+ (BOOL)getProxyStatus {
    NSDictionary *proxySettings = NSMakeCollectable([(NSDictionary *)CFNetworkCopySystemProxySettings() autorelease]);
    NSArray *proxies = NSMakeCollectable([(NSArray *)CFNetworkCopyProxiesForURL((CFURLRef)[NSURL URLWithString:@"http://www.baidu.com"], (CFDictionaryRef)proxySettings) autorelease]);
    NSDictionary *settings = [proxies objectAtIndex:0];
    
    NSLog(@"host=%@", [settings objectForKey:(NSString *)kCFProxyHostNameKey]);
    NSLog(@"port=%@", [settings objectForKey:(NSString *)kCFProxyPortNumberKey]);
    NSLog(@"type=%@", [settings objectForKey:(NSString *)kCFProxyTypeKey]);
    
    if ([[settings objectForKey:(NSString *)kCFProxyTypeKey] isEqualToString:@"kCFProxyTypeNone"])
    {
        //没有设置代理
        return NO;
    }
    else
    {
        //设置代理了
        return YES;
    }
}

二、我们可以在请求配置中清空代理,让请求不走代理

我们通过hook到sessionWithConfiguration: 方法。然后清空代理


+ (void)load{
  Method method1 = class_getClaSSMethod([NSURLSession class],@selector(sessionWithConfiguration:));
  Method method2 = class_getClassMethod([NSURLSession class],@selector(px_sessionWithConfiguration:));
  method_exchangeImplementations(method1, method2);

  Method method3 = class_getClassMethod([NSURLSession class],@selector(sessionWithConfiguration:delegate:delegateQueue:));
  Method method4 = class_getClassMethod([NSURLSession class],@selector(px_sessionWithConfiguration:delegate:delegateQueue:));
  method_exchangeImplementations(method3, method4);
}

+ (NSURLSession*)px_sessionWithConfiguration:(NSURLSessionConfiguration*)configuration delegate:(nullable id)delegate delegateQueue:(nullable NSOperationQueue*)queue
{
      if(configuration) configuration.connectionProxyDictionary = @{};

  return [self px_sessionWithConfiguration:configuration delegate:delegate delegateQueue:queue];
}

+ (NSURLSession*)px_sessionWithConfiguration:(NSURLSessionConfiguration*)configuration
{

      if(configuration) configuration.connectionProxyDictionary = @{};

  return [self px_sessionWithConfiguration:configuration];
}

​ 第二种思路的实现:

主要是针对HTTPS 请求,对证书的一个验证。

通过 SecTrustRef 获取服务端证书的内容


static NSArray * AFCertificateTrustChainForServerTrust(SecTrustRef serverTrust) {
   CFIndex certificateCount = SecTrustGetCertificateCount(serverTrust);
   NSMutableArray *trustChain = [NSMutableArray arrayWithCapacity:(NSUInteger)certificateCount];

   for (CFIndex i = 0; i < certificateCount; i++) {
       SecCertificateRef certificate = SecTrustGetCertificateAtIndex(serverTrust, i);
       [trustChain addObject:(__bridge_transfer NSData *)SecCertificateCopyData(certificate)];
   }

   return [NSArray arrayWithArray:trustChain];
}

然后读取本地证书的内容进行对比


NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"certificate" ofType:@"cer"];//证书的路径
NSData *certData = [NSData dataWithContentsOfFile:cerPath];
SSet<NSData*> * set = [[NSSet alloc]initWithObjects:certData  , nil];  // 本地证书内容
// 服务端证书内容
NSArray *serverCertificates = AFCertificateTrustChainForServerTrust(serverTrust);
for (NSData *trustChainCertificate in [serverCertificates reverseObjectEnumerator]) {
    if ([set containsObject:trustChainCertificate]) {
        // 证书验证通过
    }
}

SSL Pinning(AFN+SSL Pinning)推荐

SSL Pinning,即SSL证书绑定。通过SSL证书绑定来验证服务器身份,防止应用被抓包。

取到证书

客户端需要证书(Certification file), .cer格式的文件。可以跟服务器端索取。

如果他们给个.pem文件,要使用命令行转换:

openssl x509 -infORM PEM -in name.pem -outform DER -out name.cer

如果给了个.crt文件,请这样转换:

openssl x509 -in name.crt -out name.cer -outform der

如果啥都不给你,你只能自己动手了:

openssl s_client -connect www.WEBsite.com:443 </dev/null 2>/dev/null | openssl x509 -outform DER > myWebsite.cer**

把证书加进项目

把生成的.cer证书文件直接拖到你项目的相关文件夹中,记得勾选Copy items if neede和Add to targets。

参数名意思

AFSecurityPolicy

SSLPinningMode

AFSecurityPolicy是AFNetworking中网络通信安全策略模块。它提供三种SSL Pinning Mode

AFSSLPinningModeNone:完全信任服务器证书;

AFSSLPinningModePublicKey:只比对服务器证书和本地证书的Public Key是否一致,如果一致则信任服务器证书;

AFSSLPinningModeCertificate:比对服务器证书和本地证书的所有内容,完全一致则信任服务器证书;

选择那种模式呢?

AFSSLPinningModeCertificate:最安全的比对模式。但是也比较麻烦,因为证书是打包在APP中,如果服务器证书改变或者到期,旧版本无法使用了,我们就需要用户更新APP来使用最新的证书。

AFSSLPinningModePublicKey:只比对证书的Public Key,只要Public Key没有改变,证书的其他变动都不会影响使用。 如果你不能保证你的用户总是使用你的APP的最新版本,所以我们使用AFSSLPinningModePublicKey。

allowInvalidCertificates



@property (nonatomic, assign) BOOL allowInvalidCertificates;

是否信任非法证书,默认是NO。

validatesDomainName



@property (nonatomic, assign) BOOL validatesDomainName;

是否校验证书中DomainName字段,它可能是IP,域名如*.Google.com,默认为YES,严格保证安全性。

使用AFSecurityPolicy设置SLL Pinning


+ (AFHTTPSessionManager *)manager
{
    static AFHTTPSessionManager *manager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
    
        NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
        manager =  [[AFHTTPSessionManager alloc] initWithSessionConfiguration:config];

        AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey withPinnedCertificates:[AFSecurityPolicy certificatesInBundle:[NSBundle mainBundle]]];
        manager.securityPolicy = securityPolicy;
    });
    return manager;
}

扩展

Android 防止抓包

单个接口访问不带代理的


URL url = new URL(urlStr);  
urlConnection = (HttpURLConnection) url.openConnection(Proxy.NO_PROXY); 

OkHttp框架


OkHttpClient client = new OkHttpClient().newBuilder().proxy(Proxy.NO_PROXY).build(); 

以上就是详解iOS如何防止抓包的详细内容,更多关于IOS如何防止抓包的资料请关注编程网其它相关文章!

--结束END--

本文标题: 详解IOS如何防止抓包

本文链接: https://www.lsjlt.com/news/30539.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解IOS如何防止抓包
    目录抓包原理防止抓包一、发起请求之前判断是否存在代理,存在代理就直接返回,请求失败。二、我们可以在请求配置中清空代理,让请求不走代理SSL Pinning(AFN+SSL Pinni...
    99+
    2022-05-30
    IOS 防止抓包
  • IOS怎么防止抓包
    这篇文章给大家分享的是有关IOS怎么防止抓包的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。抓包原理其实原理很是简单:一般抓包都是通过代理服务来冒充你的服务器,客户端真正交互的是这个假冒的代理服务,这个假冒的服务再...
    99+
    2023-06-15
  • AndroidApp如何防止抓包
    目录前言正文补充:使用证书校验总结前言 App安全非常重要,尤其是数据安全。但是我们知道通过Charles等工具可以对App的网络请求进行抓包,如果我们的数据没有进行加密,这样这些信...
    99+
    2022-11-13
  • Android开发如何防止被Fiddler抓取HTTP/HTTPS数据包
          Android开发过程中需要网络访问获取数据,一般都是通过HTTP/HTTPS请求服务器获取数据;      但是HTTP/HTTPS请求很容易被别人使用一些像Fi...
    99+
    2022-06-06
    https HTTP fiddler android开发 Android
  • 如何理解https与抓包
    这篇文章主要介绍“如何理解https与抓包”,在日常操作中,相信很多人在如何理解https与抓包问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解https与抓包”的疑惑...
    99+
    2022-10-19
  • SpringBoot如何防止XSS注入攻击详解
    什么是 XSS 攻击 在跨站脚本(XSS)攻击中,攻击者可以在受害者的浏览器中执行恶意脚本。这种攻击通常是通过在网页中插入恶意代码 (JavaScript) 来完成的。攻击者在使用...
    99+
    2022-11-12
  • 详解Java如何实现防止恶意注册
    目录1、添加验证码2、IP 限制3、添加滑动验证4、添加邮箱验证5、添加黑名单恶意注册通常是指使用自动化脚本或者机器人在短时间内进行大量的注册行为,这种行为会对系统造成压力,甚至会导...
    99+
    2023-05-17
    Java实现防止恶意注册 Java防止恶意注册 Java 恶意注册
  • springMVC如何防止表单重复提交详解
    目录 前言防止表单重复提交单机实现的思路步骤代码实现分布式实现的思路步骤代码实现总结 前言 在系统中,有些接口如果重复提交,可能会造成脏数据或者其他的严重的问题,所以我们一般会对与数...
    99+
    2022-11-12
  • (详解)如何为模拟器安装Burpsuite证书并抓包
    ✅作者简介:CSDN内容合伙人、信息安全专业在校大学生🏆 🔥系列专栏 :网络协议分析-抓包 📃新人博主 :欢迎点赞收藏关注,会回访! Ὂ...
    99+
    2023-09-11
    网络 https 服务器
  • 详解Go如何快速实现驱动层流量抓包
    本篇文章给大家带来了关于golang的相关知识,其中主要给大家聊聊golang中怎么实现驱动层流量抓包,感兴趣的朋友一起来看一下吧,希望对大家有帮助。一、驱动抓包应用层抓包我们可以使用Fiddler、Httpdebugger、Charles...
    99+
    2023-05-14
    Golang
  • 详解vue如何防止用户多次点击请求
    在现代web应用程序中,用户操作经常需要与服务器进行交互。用户频繁点击按钮或提交表单可能会导致前端向服务端发送多个请求,这会导致性能下降和资源浪费。Vue.js是一个流行的JavaScript框架,提供了一种解决此问题的方法。在本文中,我们...
    99+
    2023-05-14
  • 详解React 如何防止 XSS 攻击论$$typeof 的作用
    目录JSXXSS 攻击防止 XSS 攻击的方法React 对于文本节点的处理dangerouslySetInnerHTML 处理富文本节点$$typeof 的作用JSX 先来简单复习...
    99+
    2022-11-13
  • Vue如何防止按钮重复点击方案详解
    目录前言目的文件结构实现请求拦截响应拦截取消重复发送请求调用前言 Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。 axios 是目前...
    99+
    2022-12-09
    Vue按钮重复点击 Vue防止按钮重复点击 Vue避免重复点击
  • vue中如何防止用户频繁点击按钮详解
    目录1、在项目中遇到一个问题:2、解决办法3、具体实现:方法1步骤:方法2:方法三:总结1、在项目中遇到一个问题: 当事件中的代码执行耗费时间,且用户在短时间不断点击按钮,造成短时间...
    99+
    2022-11-13
  • Linux如何防止SSH暴力破解
    这篇文章将为大家详细讲解有关Linux如何防止SSH暴力破解,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。SSH暴力破解是指攻击者通过密码字典或随机组合密码的方式尝试登陆服务器(针对的是全网机器),这种攻...
    99+
    2023-06-28
  • 实例讲解MyBatis如何防止SQL注入
     SQL注入是一种很简单的攻击手段,但直到今天仍然十分常见。究其原因不外乎:No patch for stupid。为什么这么说,下面就以JAVA为例进行说明: 假设数据库中存在这样...
    99+
    2022-11-12
  • iOS如何获取最顶层ViewController详解
    1 获取当前屏幕显示的 Viewcontroller //获取当前屏幕显示的viewcontroller - (UIViewController *)getCurrentVC {...
    99+
    2022-05-21
    ios 顶层 viewcontroller
  • iOS如何改变UIBarButtonItem的大小详解
    前言 基本上每个iOS APP里面都有导航,比如微信、QQ、支付宝。导航可以很方便地帮助我们管理视图控制器(UIViewController)。导航的重要性不言而喻,基本上是每一位i...
    99+
    2022-05-27
    ios uibarbuttonItem 大小
  • 如何在iOS中高效的加载图片详解
    目录前言图片的渲染流程DataBufferSD源码分析ImageBuffer占用内存大小Xcode测试如何减少图像占用内存向下采样SD源码分析解码过程选择正确的图片渲染格式渲染格式如...
    99+
    2022-05-25
    ios 加载 图片
  • 如何在iOS上使用MVVM进行路由详解
    前言 我已经在几个项目中使用MVVM了一段时间,我真的很喜欢它的简单性。特别是,如果你像许多人一样从MVC迁移,你只需要在你的架构中增加一层ViewModel。如果您发现太多层级造成...
    99+
    2022-05-25
    ios mvvm 路由
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作