抓包原理
- 其实原理很是简单:一般抓包都是通过代理服务来冒充你的服务器,客户端真正交互的是这个假冒的代理服务,这个假冒的服务再和我们真正的服务交互,这个代理就是一个中间者 ,我们所有的数据都会通过这个中间者,所以我们的数据就会被抓取。HTTPS 也同样会被这个中间者伪造的证书来获取我们加密的数据。
防止抓包
- 我们可以在请求配置中清空代理,让请求不走代理
- 目的是为了在创建NSURLSession对象的时候,自动将代理设置为一个空的字典(@{})。换句话说,它将拦截所有使用NSURLSession类创建对象的方法,将代理字典设置为空,然后再继续原本的逻辑。
- 通过这种方式,你可以确保所有使用NSURLSession创建的实例都会自动启用空的代理设置。
在AppDelegate 配置 是否允许抓包
#if DEBUG
[NSURLSession proxyEnabled: YES]; //允许抓包
#else
[NSURLSession proxyEnabled:NO]; //禁止抓包
#endif
以下是我的实现方式 直接上干货
新建一个NSURLSession 扩展
.h
@interface NSURLSession (Extensions)
+ (void)proxyEnabled:(BOOL)enabled;
@end
.m
#import <objc/runtime.h>
@implementation NSURLSession (Extensions)
static BOOL proxyEnabled = YES;
+ (void)load {
[super load];
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Class class = [NSURLSession class];
[self swizzleMethodWithClass:class
originalSelector:NSSelectorFromString(@"sessionWithConfiguration:")
swizzledSelector:NSSelectorFromString(@"_sessionWithConfiguration:")];
[self swizzleMethodWithClass:class
originalSelector:NSSelectorFromString(@"sessionWithConfiguration:delegate:delegateQueue:")
swizzledSelector:NSSelectorFromString(@"_sessionWithConfiguration:delegate:delegateQueue:")];
});
}
+ (void)proxyEnabled:(BOOL)enabled {
proxyEnabled = enabled;
}
+ (NSURLSession *)_sessionWithConfiguration:(NSURLSessionConfiguration *)configuration {
if (!proxyEnabled) {
configuration.connectionProxyDictionary = @{};
}
return [self _sessionWithConfiguration:configuration];
}
+ (NSURLSession *)_sessionWithConfiguration:(NSURLSessionConfiguration *)configuration
delegate:(nullable id<NSURLSessionDelegate>)delegate
delegateQueue:(nullable NSOperationQueue *)queue {
if (!proxyEnabled) {
configuration.connectionProxyDictionary = @{};
}
return [self _sessionWithConfiguration:configuration delegate:delegate delegateQueue:queue];
}
+ (void)swizzleMethodWithClass:(Class)cls originalSelector:(SEL)originalSelector swizzledSelector:(SEL)swizzledSelector {
Method originalMethod = class_getClassMethod(cls, originalSelector);
Method swizzledMethod = class_getClassMethod(cls, swizzledSelector);
method_exchangeImplementations(originalMethod, swizzledMethod);
}
网友评论