前言
隨著專案採用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