iOS防Charles抓包

開發中使用代理抓網絡請求很正常,那麼如何防止被代理抓包呢 

可以通過CFNetwork

通過ASIHTTPRequest的屬性,可以提取出代理設置

代碼先搞起來

/**

 @param 判斷是否設置代理

 */

+ (BOOL)getProxyStatus {

    

    NSDictionary *proxySettings = NSMakeCollectable([(NSDictionary *)CFNetworkCopySystemProxySettings() autorelease]);

    NSArray *proxies = NSMakeCollectable([(NSArray *)CFNetworkCopyProxiesForURL((CFURLRef)[NSURL URLWithString:@"http://www.google.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

    {

        //判斷模擬器和測試地址了

        if ([[self deviceModelName] isEqualToString:@"Simulator"]  || [[XTKVersionStorage getModel].appSettings[@"apiHost"] containsString:@"test"]) {

            return NO;

        }

        //設置代理了

        [self showBounced];//禁止訪問彈框

        return YES;

    }

}

 

/**

 @param 客戶端本地做證書校驗

 */

+(AFSecurityPolicy*)customSecurityPolicy

{

    // /先導入證書

    NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"cer"];//證書的路徑

    NSData *certData = [NSData dataWithContentsOfFile:cerPath];

    // AFSSLPinningModeCertificate 使用證書驗證模式 (AFSSLPinningModeCertificate是證書所有字段都一樣才通過認證,AFSSLPinningModePublicKey只認證公鑰那一段,AFSSLPinningModeCertificate更安全。但是單向認證不能防止“中間人攻擊”)

    AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];

    // allowInvalidCertificates 是否允許無效證書(也就是自建的證書),默認爲NO

    // 如果是需要驗證自建證書,需要設置爲YES

    securityPolicy.allowInvalidCertificates = YES;

    

    //validatesDomainName 是否需要驗證域名,默認爲YES;

    //假如證書的域名與你請求的域名不一致,需把該項設置爲NO;如設成NO的話,即服務器使用其他可信任機構頒發的證書,也可以建立連接,這個非常危險,建議打開。

    

    //置爲NO,主要用於這種情況:客戶端請求的是子域名,而證書上的是另外一個域名。因爲SSL證書上的域名是獨立的,假如證書上註冊的域名是www.google.com,那麼mail.google.com是無法驗證通過的;當然,有錢可以註冊通配符的域名*.google.com,但這個還是比較貴的。

    //如置爲NO,建議自己添加對應域名的校驗邏輯。

    securityPolicy.validatesDomainName = YES;

    NSSet<NSData*> * set = [[NSSet alloc]initWithObjects:certData  , nil];

    securityPolicy.pinnedCertificates = set;

    return securityPolicy;

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章