背景
- 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_ID
でcfurl_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のキャッシュに関しては今回の対応で影響を受けないと判断しています。