Включенное кэширование сетевых запросов
![]() |
Критичность: ВЫСОКИЙ |
| Способ обнаружения: DAST, SENSITIVE INFO |
Описание
При использовании стандартной библиотеки для осуществления сетевого взаимодействия в iOS все сетевые запросы кэшируются в файловой системе устройства. Эти файлы кэша могут обладать интересными сведениями, включая запросы на аутентификацию, содержащие все учетные данные пользователя.
Несмотря на то, что данные файлы находятся во внутренней директории приложения, хранить сессионные идентификаторы и другие чувствительные данные, относящиеся к процессу аутентификации, в открытом виде не рекомендуется.
Рекомендации
Для отключения кэширования сетевых запросов необходимо воспользоваться одним из предложенных способов в зависимости от реализации:
-
Удалить общий кэш в любое время (например, при запуске приложения):
URLCache.shared.removeAllCachedResponses() -
Отключить кэш на глобальном уровне:
let theURLCache = URLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil) URLCache.shared = theURLCache -
Использовать
URLSessionс эфемерной конфигурацией. Это рекомендуемый способ для запросов с чувствительными данными: эфемерная сессия не пишет на диск ни кэш, ни Cookies, ни учётные данные — всё хранится только в оперативной памяти и удаляется при завершении сессии.let configuration = URLSessionConfiguration.ephemeral let session = URLSession(configuration: configuration) -
Полностью отключить кэш на уровне конкретной сессии, обнулив
urlCacheи задав политику без использования кэша:let configuration = URLSessionConfiguration.default configuration.urlCache = nil configuration.requestCachePolicy = .reloadIgnoringLocalCacheData let session = URLSession(configuration: configuration) -
Создать запрос, который не будет использовать кэш, через
URLRequestс нужнойcachePolicy:var request = URLRequest(url: theURL, cachePolicy: .reloadIgnoringLocalCacheData, timeoutInterval: urlTimeoutTime)Атрибут
cachePolicyопределяет работу с кэшем; основные значения:.useProtocolCachePolicy— значение по умолчанию, кэширование зависит от HTTP-заголовков ответа..reloadIgnoringLocalCacheData— кэш не используется.
-
Запретить кэширование точечно через делегат сессии, вернув
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.
