Перейти к содержанию

Включенное кэширование сетевых запросов

Критичность: ВЫСОКИЙ
Способ обнаружения: DAST, SENSITIVE INFO

Описание

При использовании стандартной библиотеки для осуществления сетевого взаимодействия в iOS все сетевые запросы кэшируются в файловой системе устройства. Эти файлы кэша могут обладать интересными сведениями, включая запросы на аутентификацию, содержащие все учетные данные пользователя.

Несмотря на то, что данные файлы находятся во внутренней директории приложения, хранить сессионные идентификаторы и другие чувствительные данные, относящиеся к процессу аутентификации, в открытом виде не рекомендуется.

Рекомендации

Для отключения кэширования сетевых запросов необходимо воспользоваться одним из предложенных способов в зависимости от реализации:

  1. Удалить общий кэш в любое время (например, при запуске приложения):

    URLCache.shared.removeAllCachedResponses()
    
  2. Отключить кэш на глобальном уровне:

    let theURLCache = URLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil)
    URLCache.shared = theURLCache
    
  3. Использовать URLSession с эфемерной конфигурацией. Это рекомендуемый способ для запросов с чувствительными данными: эфемерная сессия не пишет на диск ни кэш, ни Cookies, ни учётные данные — всё хранится только в оперативной памяти и удаляется при завершении сессии.

    let configuration = URLSessionConfiguration.ephemeral
    let session = URLSession(configuration: configuration)
    
  4. Полностью отключить кэш на уровне конкретной сессии, обнулив urlCache и задав политику без использования кэша:

    let configuration = URLSessionConfiguration.default
    configuration.urlCache = nil
    configuration.requestCachePolicy = .reloadIgnoringLocalCacheData
    let session = URLSession(configuration: configuration)
    
  5. Создать запрос, который не будет использовать кэш, через URLRequest с нужной cachePolicy:

    var request = URLRequest(url: theURL, cachePolicy: .reloadIgnoringLocalCacheData, timeoutInterval: urlTimeoutTime)
    

    Атрибут cachePolicy определяет работу с кэшем; основные значения:

    1. .useProtocolCachePolicy — значение по умолчанию, кэширование зависит от HTTP-заголовков ответа.
    2. .reloadIgnoringLocalCacheData — кэш не используется.
  6. Запретить кэширование точечно через делегат сессии, вернув nil в urlSession(_:dataTask:willCacheResponse:completionHandler:):

    func urlSession(_ session: URLSession, dataTask: URLSessionDataTask,
                    willCacheResponse proposedResponse: CachedURLResponse,
                    completionHandler: @escaping (CachedURLResponse?) -> Void) {
        completionHandler(nil)
    }
    

NSURLConnection устарел

Класс NSURLConnection объявлен устаревшим начиная с iOS 9; вместо него следует использовать URLSession. Управление кэшем выполняется через URLSessionConfiguration (.ephemeral, свойство urlCache) и URLCache, а не через делегатные методы NSURLConnection.

Ссылки

  1. https://codewithchris.com/preventing-nsurlconnection-cache-issues/
  2. https://developer.apple.com/forums/thread/45794
  3. https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/URLLoadingSystem/Concepts/CachePolicies.html
К началу