Data目录中最重要的是Application子目录。Data/Applications目录包含了应用程序运行所需的其他数据:参数设置,缓存,cookie等。这个目录也是需要重点检查的对象。因为大部分数据泄露都发生在这里。下面我来深入的介绍一下这些子目录,当然,目录树中的目录不一定会全部出现在应用的目录中,有一些是使用特定的API创建的。
Documents和Inbox目录
Documents目录主要用来存储非临时状态的应用数据,比如用户创建的内容或应用程序在离线模式下需要的本地缓存信息。 如果你在应用的Info.plist文件中设置了UIFileSharingEnabled,那么可以通过iTunes访问这些文件。
其他应用发送过来的文件储存在Documents/Index目录中。这些应用可以使用UIDocumentInteractionController类来发送文件。
你只能读取和删除存储在Inbox目录下的文件。这些来自于其他应用程序的文件不能写入你的应用目录里,他们将被一个优先级更高的系统进程处理。 你可以定期删除这些文件也可以让用户选择是否删除,这样用户就可以知道这里有没有敏感信息。
如果你正在开发一个应用想确保磁盘上不会遗留任何敏感信息,那么可以将Inbox目录中的文档复制到另外一个位置,从而对数据进行保护,然后从Inbox目录中移除这些文件。
注意,你的应用程序请求打开的任意文件都有可能永久的遗留在磁盘中。如果你尝试打开一个应用程序无法处理的文件类型,那么这个文件将会被传递给第三方应用,我们无法知道第三方应用是否会将它删除或者也许会将文件永久保留下来。换句话说,你无法清理那些要求第三方应用打开的文件即使只是用Quick Look API来简单预览一下内容。Inbox文件在外面存放太长时间很危险,应该考虑让你的应用能够查看自己的数据,而不是依赖一个帮手,你保证最后正确的清除这些文件。
Library目录
Library目录包含应用程序相关的大部分文件包括由应用程序和网络产生的缓存数据。Library目录下的文件可以通过iTunes和iCloud进行备份,Cache目录除外。
Application Support目录
由用户创建和接受的文件不会储存在Application Support目录中,该目录主要用来存储应用程序使用的数据文件。例如,一个应用程序内购买的下载内容,配置文件,积分榜等。正如它名字所暗示的那样,该目录下的文件,主要用来支持应用程序运行,这些文件可以在应用程序安装时不熟也可以由应用程序创建或从网络上下载。
默认情况下iiTunes会备份这个目录下的数据到你的计算机和iCloud中。但是如果你不放心将数据保存在苹果的云端也可以通过为新创建的文件设置NSURLIsExcludedFromBackupKey属性来禁止备份到云端。
值得注意的是,苹果只要求应用备份用户数据到iCloud,包括用户创建的文档配置文件等,不要求应用程序备份数据。如果一个应用程序,允许将应用相关的内容备份到iCloud上,比如可下载内容,那么该应用,一定会被App Store拒绝上架。
Caches和Snapshots目录
Caches目录在功能上类似网页浏览器的缓存:应用程序保留数据的主要目的是为了性能,而不是因为数据本身很重要。所以iTunes不会备份此目录。
虽然苹果声明应该由你的应用程序管理Caches目录但是操作系统,其实也会操作该目录下的内容和子文件夹Snapshots。我们应该形成一种思维定式:Caches目录用来存放临时内容,伴随着应用程序的启动与退出,这些内容将会被丢弃。iOS在系统运行空间不足时也会自动删除这些话传目录,不过并不会删除当前正在运行程序的缓存。
Caches目录有时也会把网页缓存内容存储在子目录Caches/com.mycompany.myapp
中。该位置也容易泄露敏感信息,因为通过https进行长时间传输数据可以被iOS缓存。如果开发者没有禁止数据缓存和尽快使缓存数据过期,那么攻击者总能在这里尝到甜头。
最后,当应用程序,进入后台操作系统会自动把当前应用的屏幕快照存储在Snapshots子目录中,这样做会无形中把一些敏感信息存储在本地。操作系统的初衷是好的:应用被切回前台时操作系统可以使它的屏幕快照创建一个快速的动画。不幸的是,在很多应用中经常看到由此产生的副作用:截图中包含了用户的社会保险号码,用户的详细信息以及其他敏感内容。
Cookies目录
由URL加载系统所产生的Cookie都存储在Cookies目录中。创建NSURLRequest请求时,你将指定相关的Cookie策略,或者选择系统默认的策略。和OS X不同,iOS上的Cookie不会在应用程序之间共享,每个应用都有单独的目录来存储自己的Cookie。
Preferences目录
iOS将应用的偏好设置存储在Preferences目录下,但是不允许应用,直接编辑目录中的文件。 取而代之,此目录下文件的创建,读取和操作都通过NSUserDefaults或CFPreferences API来完成。
这些API将应用设置文件已传文本的格式存储,因此绝不能用它们来存储敏感的用户信息和证书。审查一个应用的本地存储信息时一定要记得检查Preference目录中的plist文件。有时候你会在这些plist文件中,发现用户名和密码API访问密钥和不应该暴露给用户的安全设置。
保存应用程序状态的目录
用户期待应用能够记住他们输入文本框的内容和启用的设置。如果一个用户切换到另外一个应用,片刻后又切回之前的应用,原先的应用可能已经在后台被操作系统杀掉了。为了在应用启动时使它的界面和之前保持一致,新版本的iOS通过State Preservation API将对象状态信息存储在Saved Application State目录中。开发者可以将需要保存状态的UI标记出来。
tmp目录
正如你猜测的那样,tmp用来存储临时文件。和Caches目录一样,当你的应用程序停止运行时,该目录中包含的文件可能会被操作系统自动删除。此目录的使用方法与Caches目录类似,不同之处在于Caches意味着缓存的这些文件可能会被再次获取和重新创建。比如,你从远程服务器下载了特定的应用数据,然后为了提高性能,会将数据缓存在Caches中,如果输就消失了,可以重新去下载。另一方面tmp严格存储着由应用产生的临时数据,也就是说如果这些文件在重新访问前被删除,你并不能重新获取到他们。此外,和Caches目录一样,tmp也不会被分到iTunes或iCloud中。