Хранение чувствительной информации в Binary Cookies
![]() |
Критичность: ИНФО |
| Способ обнаружения: DAST, ФАЙЛЫ ПРИЛОЖЕНИЯ |
Описание
Приложение не отключает хранение значений Cookies при работе с WebView.
При использовании WebView (это касается как устаревшего UIWebView, так и WKWebView) необходимо помнить, что значения Cookies, полученные при посещении сайта, сохраняются локально в файле специального формата Cookies.binarycookies. При этом в данных значениях могут быть и чувствительные данные, к примеру, сессионные идентификаторы или токены для доступа к сервису.
UIWebView устарел
Компонент UIWebView объявлен устаревшим (deprecated) начиная с iOS 12, а с декабря 2020 года Apple не принимает в App Store приложения, использующие UIWebView. Для отображения веб-контента следует использовать WKWebView: помимо актуального статуса, он работает в отдельном процессе и предоставляет более гибкое управление хранилищем данных (включая Cookies) через WKWebsiteDataStore.
Рекомендации
При правильном использовании необходимо ограничивать хранение Cookie временем, в которое они используются. Обычно при закрытии WebView эти данные больше не нужны. А лучше всего отключить использование Cookie вообще.
Как пример, можно отключить хранение:
import UIKit
import WebKit
class ViewController: UIViewController, WKUIDelegate {
var webView: WKWebView!
override func loadView() {
let webConfiguration = WKWebViewConfiguration()
webView = WKWebView(frame: .zero, configuration: webConfiguration)
webView.uiDelegate = self
view = webView
}
override func viewDidLoad() {
super.viewDidLoad()
let myURL = URL(string: "http://example.com")
var myRequest = URLRequest(url: myURL!)
myRequest.httpShouldHandleCookies = false
webView.load(myRequest)
}
}
Для удаления значений Cookie из общего хранилища системы загрузки URL (например, при логауте из приложения или его закрытии/открытии):
let storage = HTTPCookieStorage.shared
if let cookies = storage.cookies {
for cookie in cookies {
storage.deleteCookie(cookie)
}
}
WKWebView хранит данные в собственном изолированном хранилище WKWebsiteDataStore, не связанном с HTTPCookieStorage.shared. Поэтому Cookies и другие данные веб-контента нужно очищать именно через него:
let dataStore = WKWebsiteDataStore.default()
let types: Set<String> = [WKWebsiteDataTypeCookies]
dataStore.removeData(ofTypes: types, modifiedSince: .distantPast) {
// данные веб-контента удалены
}
Если веб-данные не должны сохраняться между сессиями вовсе, используйте непостоянное хранилище WKWebsiteDataStore.nonPersistent() при создании WKWebViewConfiguration.
