关于iOS Webview 加载React 静态资源的安全问题

788 阅读2分钟

前言

随着项目采用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