iOS黑客攻防秘籍(第2版)
上QQ阅读APP看书,第一时间看更新

1.2 沙盒

沙盒(sandbox)是 iOS 的一个防御机制,每个应用都有一个属于自己的沙盒。应用只能在自己的沙盒目录下读写数据,应用 A 不能访问应用 B 的沙盒,它们之间是互相隔离的。正因如此,攻击者在上传恶意程序后,即使侥幸通过了 App Store 的审核,安装到用户手机上的应用也无法获取其他应用的数据。获取沙盒目录的方法如下:

-(void)getPath{
    //获取沙盒根目录路径
    NSString*homeDir = NSHomeDirectory();
    NSLog(@"homedir: %@",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);
}

输出的结果如下:

homedir:   /var/mobile/Containers/Data/Application/E24754D2-22F8-4E8E-8A6C-2B18561DB5AD
docDir:    /var/mobile/Containers/Data/Application/E24754D2-22F8-4E8E-8A6C-2B18561DB5AD/Documents
libDir:    /var/mobile/Containers/Data/Application/E24754D2-22F8-4E8E-8A6C-2B18561DB5AD/Library  cachesDir:
    /var/mobile/Containers/Data/Application/E24754D2-22F8-4E8E-8A6C-2B18561DB5AD/Library/Caches
tmpDir:
    /private/var/mobile/Containers/Data/Application/E24754D2-22F8-4E8E-8A6C-2B18561DB5AD/tmp/
appDir:
    /private/var/mobile/Containers/Bundle/Application/A5E6DC61-7AAA-467F-BC63-5BEDB8DDB113/
    testSandbox.app

沙盒机制限制了应用只能读写沙盒之内的文件,而我们在有些情况下需要访问一些公共资源(比如通讯录、短信、照片和位置等),这些是存在于沙盒之外的。针对这个问题,苹果公司提供了公开的 API 用于访问公共资源,并且每次访问时都会弹出申请权限提示框,只有用户允许后,才能访问成功,比如微信访问照片时会提示需要用户授权,如图 1-3 所示。

图 1-3 微信访问照片库