针对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; }