在 iOS 设备内截取 HTTP/HTTPS 信息

目录

前言:

0x01.Why?

0x02. How?


前言:

在 iOS 设备上截取 HTTP/HTTPS 信息是一项常见的测试任务,因为 HTTP/HTTPS 请求和响应是应用程序与服务器之间通信的重要数据。但是,由于 iOS 设备的安全性和隐私保护,我们需要一种可靠的方法来截取 HTTP/HTTPS 信息。

0x01.Why?

做移动测试的同学经常会在 app 和 server 中间架设一个代理(例如 charles 或者 fiddler 等),由经代理,app 和 server 之间的交互及交互内容变得可视化,使得我们不再摸黑测试。事实上,能够很好的掌握 app 和 server 端的交互不仅对于测试,对于开发,对于产品的整个质量提高都是有非常大益处的。但是,有些场景下,架设代理变得不易,或者难于满足要求,举几个例子:

  • 想要找出正常用户使用时候,哪些场景最耗流量(你不能让用户挂代理,如果有针对网络流量的优化,挂代理也看不出问题来)。
  • 想要找出请求的各种接口中,哪些服务不稳定,如间歇出现 4xx 或者 5xx 错误,这需要统计大量的数据,单一客户端挂代理是做不到的(当然服务端监控如果做得好也能实现)。
  • 想要找出某些特定条件下(如弱网,网络切换等)客户端自己产生的请求错误或者超时等等。
  • 想要查看一些特殊场景下接口是否会发生重复调用,错误调用序列。这些 issue 往往藏的很深,不易出现。这时候往往需要分析日志的 pattern 来把问题揪出来,这时候你就会发现,代理软件做日志分析很麻烦,也要导出来专门分析,而且总挂着代理极为不方便(至少不能切换网络,日志也要根据 app 做筛查,因为一般都是全流量截取)。

这时候需求就变成了:最好在 app 内部能够截取所有的 HTTP/HTTPS 流量,以某种方式保存下来,并且能够以某种方式传递给需要用这些数据的人。这其实是一种 APM(Application Performance Monitoring)的概念,国外最早已经有人实现了这种功能,如 newrelic New Relic | Monitor, Debug and Improve Your Entire Stack 国内也有一些类似的厂商了。

0x02. How?

先想一下我们每天都在使用的代理工具是如何实现的呢?代理工具会拦截所有的 http 的请求,记录下我们需要的信息后替代客户端重新发送相同的请求给服务端;拦截返回,记录下想要的东西后返回给客户端。如果 JAVA 写的多,你可能看到过各种 interceptor 来截取流量。OKHttp 的作者介绍这款被广泛应用的 http client 的时候曾经说过:OKHttp 只不过是请求和响应之间做了一堆 interceptor 而已。

具体落到 iOS 上。iOS 的 Foundation 框架提供了 URL Loading System 这个库 (后面简写为 ULS),所有基于 URL(例如 http://,https:// ,ftp://这些应用层的传输协议) 的协议都可以通过 ULS 提供的基础类和协议来实现,你甚至可以自定义自己的私有应用层通讯协议。

而 ULS 库里提供了一个强有力的武器 NSURLProtocol。 继承 NSURLProtocol 的子类都可以实现截取行为,具体的方式就是:如果注册了某个 NSURLProtocol 子类,ULS 管理的流量都会先交由这个子类处理,这相当于实现了一个拦截器。由于现在处于统治地位的的 http client 库 AFNetworking 和 Alamofire 都是基于 URL Loading System 实现的,所以他们俩和使用基础 URL Loading System API 产生的流量理论上都可以被截取到。

注意一点,NSURLProtocol 是一个抽象类,而不是一个协议(protocol)。

为了达到监控流量的目的,我们就先设计一个类来实现 NSURLProtocol 吧:


// MyHttpProtocol.h 
#import <Foundation/Foundation.h>
@interface MyHttpProtocol : NSURLProtocol
@end

//MyHttpProtocol.m

#import <Foundation/Foundation.h>
#impo
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值