前提:移动端的数据窃取是一个非常严重的问题,哪些保存着重要数据的设备丢失或被盗,不要让攻击者通过物理手段来读取到数据,在本文章介绍几种数据泄露方式。
1.解密NSLog 和苹果日志
NSLog:在调试时将消息发送到Xcode控制台,在设备上运行时将消息发送到系统全局日志,然后由NSLog记录数据可以被任何拿到物理设备,和其他缓存的应用程序类似。
在发布版本中禁用NSLog
移除NSLog输出最简单的方法就是使用可变参数宏,
#ifdef DEBUG
#define _GTMDevLog(...) NSLog(__VA_ARGS__)
#else
#define _GTMDevLog(...) do { } while (0)
#endif
注意:
NSLog 可能将数据泄露到硬盘,从而给物理攻击者,创造机会,除此之外数据也可能通过其他方式在应用程序之间泄露,
2.敏感数据如何通过剪贴板泄露
iOS 剪贴板是一种灵活的机制,能够在应用内,或应用间共享任意数据。借助剪贴板可以在应用之间共享文本数据或系列化对象,你可以选择是否将剪贴板数据储存到硬盘中。
UIPasteboard 系统的剪贴板,没有任何访问控制,或者访问限制,如果应用向剪贴板存放了一些信息,那所有的应用都可以读取,删除,或者窃取数据,一些后台可能会定期访问剪贴板内容以获取敏感数据。
剪贴板的保护策略
- 我是否希望用户将信息复制到其他应用?应用是否只需要在我的应用中移除数据?
- 剪贴板数据应该储存多长时间?
- 应用中的一些数据是否应该禁止复制数据?
- 应用中哪些位置应改禁止粘贴数据?
切换应用时清空剪贴板
如果只是希望用户自己的应用中使用复制和粘贴,那那在相应的事件中。清空粘贴板,以确保数据不会遗留在粘贴板中。在applicationDidEnterBackground和applicationWillTerminate 中设置pasteBoard.items = nil 清空粘贴板即可。
有选择性的禁止复制/粘贴
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
3.缓存管理
官方文档中删除缓存数据的方法[[NSURLCache sharedURLCache] removeAllCachedResponses];只会从内存中删除缓存条目,同样的信息,仍然会被保存在硬盘中,并且不会被删除
干脆不要缓存
[[NSURLCache sharedURLCache] setDiskCapacity:0];
[[NSURLCache sharedURLCache] setMemoryCapacity:0];
通过限制缓存的容量禁止缓存储存。
另外一种方法
- (NSCachedURLResponse *)connection:(NSURLConnection *)connection
willCacheResponse:(NSCachedURLResponse *)cachedResponse
{
if (self.cacheResponse) {
return self.cacheResponse(connection, cachedResponse);
} else {
if ([self isCancelled]) {
return nil;
}
return cachedResponse;
}
}
通过服务器禁止缓存
Cache-Control HTTP头来命令客户端不要缓存请求,这个不仅可以在应用级别禁用缓存,还可以针对特定的网络请求禁用缓存。
推荐使用
之前的方法都是禁止数据缓存,但是有时候想要在数据缓存之后,将其删除,可能处于性能原因。
删除硬盘的唯一方法
[[NSFileManager defaultManager] removeItemAtPath:filePath error:nil];
4.用户偏好设置的错误用法
用户偏好设置通常包含敏感信息。
如果认证的信息文明储存在属性列表,这就是最严重的数据泄露。
用偏好设置储存信息最好用加密过得数据