2013-07-16 173 views
5

我在使用UIWebView呈現作爲應用程序包一部分的HTML5代碼的iOS應用程序中遇到問題。敏感數據存儲在cache.db-wal文件中?

此HTML5代碼向我們的後端發出ajax請求,後者可能有敏感數據。這些都是通過HTTPS完成的,我們的應用程序從不存儲敏感數據。但是,這樣做安全測試的應用程序時,我們發現其中被存儲在本地SQL精簡版數據庫(cache.db)是HTTP POST請求的的iOS 5,這是很容易來管理,通過設置NSURLCache的

全局對象具有零磁盤存儲,並在適當時刪除該文件。

然而,它看起來像在iOS 6.1中蘋果已經改變了實施,並且數據被存儲在cache.db-wal中。我對SQL Lite的知識有限,但我認爲這是在SQL Lite使用特定選項初始化時創建的文件。

有關修復的任何建議?

+1

有關磁盤緩存url請求的更多信息。 http://petersteinberger.com/blog/2012/nsurlcache-uses-a-disk-cache-as-of-ios5/ – Casey

+0

我們商店的實驗表明,設置「Cache-Control:no-cache,no-store」可以防止緩存。不過,我們仍在仔細檢查。請保持每個人都更新此狀態。 –

回答

4

經過進一步的研究,似乎上面的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

SQLite創建的其他文件(-journal,-wal,-shm)是數據庫本身的一部分。

當您刪除cache.db文件時,還會刪除任何cache.db-*文件。


爲了防止數據被插入在首位,打開數據庫,並在每個表創建一些觸發器是這樣的:

CREATE TRIGGER MyTable_evil_trigger 
BEFORE INSERT ON MyTable 
BEGIN 
    SELECT RAISE(IGNORE); 
END; 

(再檢查的UIWebView是否吹起來的時候插入記錄實際上並沒有顯示出來......)

+0

我不認爲這是一個理想的答案,但它肯定會起作用。事情就是這樣,Apple通過緩存這樣的數據來打破Http 1.1合約,而不考慮緩存控制,並且他們正在緩存http帖子上的數據! – Casey

+0

如果我刪除了cach.db- *文件,它們仍然會被創建,並且至少在一段時間內,敏感數據將被寫入設備並且易受攻擊。使用iExplorer和記事本等工具檢索這些信息是相當容易的,前提是您可以通過物理方式訪問設備。 – Casey

+0

這是一個非常有創意的答案,雖然看起來有點冒失,但它可能是最好的選擇。我對此進行了廣泛的研究,並且沒有什麼信息。我懷疑有很多應用程序受到這種影響,並暴露了NSURLCache數據庫中的敏感信息。 – Casey

1

您可以撥打

[[NSURLCache sharedURLCache] removeAllCachedResponses] 

這將清除所有從Cache.db文件緩存的URL電話。