前言
随着项目采用hybrid 开发模式,基于单webview通过本地server加载react静态资源。过程中遇到一些一下安全的问题。
工具
HTTP server:CocoaHTTPServer
问题
1.本地server端口被占用。动态分配端口cookie 丢失。
通过NSHTTPCookieStorage 读取本地cookie,并添加到request的header。
简单介绍下NSHttpCookiesStorage是管理cookie的一个单例,每个Cookie都是一个NSHTTPCookie的实例,所有应用的cookies都被保存在这个NSHTTPCookieStorage的单例中,并且跨进程同步。 在iOS中,cookie不会共享,只存在应用的沙盒中。
代码如下:
NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];
NSMutableDictionary *cookieDic = [NSMutableDictionary dictionary];
NSMutableString *cookieValue = [NSMutableString stringWithFormat:@""];
NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie *cookie in [cookieStorage cookiesForURL:[NSURL URLWithString:urlstr relativeToURL:[NSURL URLWithString:@"localhost"]]]) {
[cookieDic setObject:cookie.value forKey:cookie.name];
}
// cookie去重复,
for (NSString *key in cookieDic) {
NSString *appendString = [NSString stringWithFormat:@"%@=%@;", key, [cookieDic valueForKey:key]];
[cookieValue appendString:appendString];
}
[req addValue:cookieValue forHTTPHeaderField:@"Cookie"];
[self.webview loadRequset:req];
2.外部进程可以直接访问APP本地server。本地server数据可以被抓包。
1.通过 摘要认证进行用户名密码验证,可以使是外部进程无法通过验证,从而无法访问。
摘要认证( Digest authentication)是一个简单的认证机制,最初是为HTTP协议开发的,因而也常叫做HTTP摘要,在RFC2617中描述。其身份验证机制很简单,它采用杂凑式(hash)加密方法,以避免用明文传输用户的口令。 摘要认证就是要核实,参与通信的双方,都知道双方共享的一个秘密(即口令)。
代码:
//digest 认证
NSString *_authorization = [NSString stringWithFormat:@"Digest username=\"asml\",uri=\"/\""];
//basic 认证
// NSString *_authorization = [NSString stringWithFormat:@"Basic username=\"asml\",uri=\"/\""];
[req setValue:_authorization forHTTPHeaderField:@"Authorization"];
2.数据传输采用SSL/TLS 单向认证,APP内部校验server证书。
官话说SSL是安全套接层(secure sockets layer),TLS是SSL的继任者,叫传输层安全(transport layer security)。说白点,就是在明文的上层和TCP层之间加上一层加密,这样就保证上层信息传输的安全。如HTTP协议是明文传输,加上SSL层之后,就有了HTTPS.
代码:
本文暂时没有demo,可以参考 CocoaHTTPServer