沙盒(sandbox)是 iOS 的一個防御機制,每個應用都有一個屬于自己的沙盒。應用只能在自己的沙盒目錄下讀寫數(shù)據(jù)梗醇,應用 A 不能訪問應用 B 的沙盒,它們之間是互相隔離的撒蟀。正因如此叙谨,攻擊者在上傳惡意程序后,即使僥幸通過了 App Store的審核保屯,安裝到用戶手機上的應用也無法獲取其他應用的數(shù)據(jù)手负。獲取沙盒目錄的方法如下:
- (void)getPath{
//獲取沙盒根目錄路徑
NSString *homeDir = NSHomeDirectory();
NSLog(@"honedir:%@",homeDir);
//獲取 Documents 目錄路徑
NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSLog(@"docDir: %@",docDir);
//獲取 Library 目錄路徑
NSString *libDir = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
NSLog(@"libDir: %@",libDir);
//獲取 cache 目錄路徑
NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
NSLog(@"cachesDir: %@",cachesDir);
//獲取 tmp 目錄路徑
NSString *tmpDir = NSTemporaryDirectory();
NSLog(@"tmpDir: %@",tmpDir);
//獲取應用自身的 xx.app 目錄
NSBundle *bundle = [NSBundle mainBundle];
NSString *strAppPath = [bundle bundlePath];
NSLog(@"appDir: %@",strAppPath);
}
輸出的結果如下:
沙盒機制限制了應用只能讀寫沙盒之內的文件,而我們在有些情況下需要訪問一些公共資源(比如通訊錄、短信、照片和位置等)杠氢,這些是存在于沙盒之外的驳棱。針對這個問題融柬,蘋果公司提供了公開的 API 用于訪問公共資源,并且每次訪問時都會彈出申請權限提示框,只有用戶允許后,才能訪問成功喘鸟,比如微信訪問照片時會提示需要用戶授權,如圖所示驻右。
微信訪問照片庫
摘自《iOS黑客攻防秘籍(第2版)》