!文章内容如有错误或排版问题,请提交反馈,非常感谢!
针对APP的黑产,我们提到部分用户会通过改变IP来绕过风控策略。更改IP比较方便的方法是使用代理IP或VPN。
在检测APP安全性是需要对是否使用代码和VPN做判断。以下为整理的一些代码供参考。
Android判断是否使用代理IP
private boolean isWifiProxy(Context context){ final boolean IS_ICS_OR_LATER = Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH; String proxyAddress; int proxyPort; if(IS_ICS_OR_LATER){ proxyAddress = System.getProperty("http.proxyHost"); String portStr = System.getProperty("http.proxyPort"); proxyPort = Integer.parseInt((portStr != null ? portStr : "-1")); }else{ proxyAddress = android.net.Proxy.getHost(context); proxyPort = android.net.Proxy.getPort(context); } return (!TextUtils.isEmpty(proxyAddress)) && (proxyPort != -1); }
Android判断是否使用VPN
boolean checkVPN(ConnectivityManager connMgr){ //don't know why always returns null: NetworkInfo networkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_VPN); boolean isVpnConn = networkInfo == null ? false : networkInfo.isConnected(); return isVpnConn; }
iOS判断是否使用代理IP
#import "CETCProxyStatus.h" @implementation CETCProxyStatus +(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; } }
iOS判断是否使用VPN
-(BOOL)isVPNOn { BOOL flag = NO; NSString *version = [UIDevice currentDevice].systemVersion; //need two ways to judge this. if(version.doubleValue >= 9.0) { NSDictionary *dict = CFBridgingRelease(CFNetworkCopySystemProxySettings()); NSArray *keys = [dict[@"__SCOPED__"] allKeys]; for(NSString *key in keys){ if([key rangeOfString:@"tap"].location != NSNotFound || [key rangeOfString:@"tun"].location != NSNotFound || [key rangeOfString:@"ipsec"].location != NSNotFound || [key rangeOfString:@"ppp"].location != NSNotFound){ flag = YES; break; } } } else { struct ifaddrs *interfaces = NULL; struct ifaddrs *temp_addr = NULL; int success = 0; //retrieve the current interfaces - returns 0 on success success = getifaddrs(&interfaces); if(success == 0) { //Loop through linked list of interfaces temp_addr = interfaces; while(temp_addr != NULL) { NSString *string = [NSString stringWithFormat:@"%s", temp_addr->ifa_name]; if([string rangeOfString:@"tap"].location != NSNotFound || [string rangeOfString:@"tun"].location != NSNotFound || [string rangeOfString:@"ipsec"].location != NSNotFound || [string rangeOfString:@"ppp"].location != NSNotFound) { flag = YES; break; } temp_addr = temp_addr->ifa_next; } } //Free memory freeifaddrs(interfaces); } return flag; }