我在iOS应用程序中遇到一个问题,该应用程序使用UIWebView呈现作为应用程序包一部分的HTML5代码。
此HTML5代码向我们的后端发出ajax请求,这些请求可能包含敏感数据。这一切都是通过HTTPS完成的,我们的应用程序从不存储敏感数据。但是,在对应用程序进行安全性测试时,我们发现http post请求存储在iOS 5的本地SQL Lite数据库(cache.db)中。
通过将NSURLCache全局对象设置为零磁盘存储并在适当时删除该文件,可以轻松管理它。
然而,现在看来,在iOS 6.1中,Apple再次更改了实现,并且数据存储在cache.db-wal中。我对SQL Lite的了解有限,但我认为这是在使用某些选项初始化SQL Lite时创建的文件。
有关修复的任何建议吗?
答案 0 :(得分:5)
经过进一步的研究,似乎上面的Hot Licks的建议是正确的,通过在HTTP响应中添加“no-cache,no-store”值,HTTP请求值没有记录在SQLite数据库中。
例如,在ASP.Net MVC中:
public ActionResult PostSensitiveData(string data)
{
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();
return Json(data);
}
答案 1 :(得分:1)
SQLite创建的其他文件(-journal
,-wal
,-shm
)是数据库本身的一部分。
删除cache.db
文件时,还要删除所有cache.db-*
个文件。
为了防止数据首先被插入,打开数据库并在每个表上创建这样的触发器:
CREATE TRIGGER MyTable_evil_trigger
BEFORE INSERT ON MyTable
BEGIN
SELECT RAISE(IGNORE);
END;
(然后检查当插入的记录实际上没有出现时UIWebView是否会爆炸......)
答案 2 :(得分:1)
你可以打电话
[[NSURLCache sharedURLCache] removeAllCachedResponses]
这将清除Cache.db文件中的所有缓存url调用。