LoginSignup
27
19

More than 3 years have passed since last update.

iOSでCache.dbにデータを保存させない

Last updated at Posted at 2017-04-12

背景

  • iOSアプリのセキュリティ診断を受けた時に次のような指摘を受けました。

Cache.dbにWebAPIリクエストに使っているメールアドレス、パスワードのキャッシュが残っている。
パス:/Library/Caches//Cache.db

端末に平文でメールアドレス、パスワードが残っているのはよろしくないというご指摘です。

もちろん通信はHTTPSを使いで暗号化していますが、Cache.dbには平文で残ってしまいます。

解決方法

先に結論ですが、アプリ起動時に次の処理を実行することで、Cache.dbにデータを残さないように実装できました。

URLCache.shared.diskCapacity = 0
URLCache.shared.memoryCapacity = 0

以下では、解決に至るまでに行ったことを記載します。

Cache.dbの確認

本当に平文で残っているのか確認します。

Cache.dbファイルを探す

  • Simulatorでアプリ起動
  • Xcode > Windwos > Devices から対象SimulatorのIDを確認
  • Simulatorのデータがある下記に移動
    ~/Library/Developer/CoreSimulator/Devices/<確認したSimulatorのID>/
  • 更にその下にあるアプリ一覧のディレクトリに移動
    ./data/Containers/Data/Application/
  • アプリのUUIDを特定する方法はわからなかったのでこのディレクトリ配下でアプリのbundleIdを検索

これでCache.dbが見つかりました。

なお、アプリのUUIDは一定時間経過すると変更されるので注意してください。

Cache.dbの中身を確認

  • sqliteでCache.dbを開く
  • テーブル一覧、スキーマ一覧を確認
  • スキーマ名からcfurl_cache_blob_dataテーブルのresponse_objectスキーマを疑う
  • cfurl_cache_responseテーブルを検索し、対象リクエストのentry_IDを取得
  • 取得したentry_IDcfurl_cache_blob_dataテーブルを検索
  • response_objectスキーマの型はBLOBなので以下のクエリを使用
select entry_ID, hex(response_object) from cfurl_cache_blob_data where entry_ID = 1;
  • 得られたデータを文字列に変換

これで指摘された値を確認することが出来ました。

補足1: NSURLRequest.cachePolicyで制御できないか

  • こちらの記事にあるようにcachePolicyにNSURLRequestReloadIgnoringLocalCacheDataを設定するとキャッシュを無効にできます。
  • ただしこの設定はリクエストにキャッシュを使用しないだけで、Cache.dbにデータは残ります。

補足2: WebViewのキャッシュは影響を受けるか

  • 少しパスは違いますがこちらの記事にあるようにCache.dbにはWebViewのキャッシュも残るという記事がいくつかあります。
  • 今回のアプリはWKWebViewを使用しましたが、指摘されたCache.dbにWebViewのキャッシュは書き込まれていませんでした。
  • そのため、WebViewのキャッシュに関しては今回の対応で影響を受けないと判断しています。

参考にしたページ

27
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
19