抓包原理
- 其實原理很是簡單:一般抓包都是通過代理服務(wù)來冒充你的服務(wù)器,客戶端真正交互的是這個假冒的代理服務(wù),這個假冒的服務(wù)再和我們真正的服務(wù)交互,這個代理就是一個中間者 ,我們所有的數(shù)據(jù)都會通過這個中間者,所以我們的數(shù)據(jù)就會被抓取。HTTPS 也同樣會被這個中間者偽造的證書來獲取我們加密的數(shù)據(jù)。
防止抓包
- 我們可以在請求配置中清空代理,讓請求不走代理
- 目的是為了在創(chuàng)建NSURLSession對象的時候,自動將代理設(shè)置為一個空的字典(@{})。換句話說,它將攔截所有使用NSURLSession類創(chuàng)建對象的方法,將代理字典設(shè)置為空,然后再繼續(xù)原本的邏輯。
- 通過這種方式,你可以確保所有使用NSURLSession創(chuàng)建的實例都會自動啟用空的代理設(shè)置。
在AppDelegate 配置 是否允許抓包
#if DEBUG
[NSURLSession proxyEnabled: YES]; //允許抓包
#else
[NSURLSession proxyEnabled:NO]; //禁止抓包
#endif
以下是我的實現(xiàn)方式 直接上干貨
新建一個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);
}