Назад в Центр знаний
Идентичность

Почему режим инкогнито не защищает от снятия отпечатков

Режим инкогнито очищает cookies, но оставляет отпечаток браузера без изменений. Почему приватного просмотра недостаточно и как сравнить приватный и обычный сеансы.

BotBrowser Team

Документация

Нужна поддерживаемая продуктовая документация?

У этой статьи есть соответствующая страница в центре документации. Используйте docs для каноничного сценария настройки, актуальных флагов и долгосрочной справки.

Приватный просмотр, который в Chrome называется «режим инкогнито», а в Edge «InPrivate», часто описывают как способ работать в сети без слежки. На деле возможности у него уже. Приватное окно не позволяет браузеру сохранять на устройстве историю, cookies, данные сайтов и введённые в формы значения после завершения сеанса. Оно не меняет IP-адрес, который видит сайт, и не меняет сигналы, которые браузер раскрывает о своём оборудовании и программном обеспечении, пока страница открыта. В справке Chrome прямо сказано, что режим инкогнито не делает вас невидимым, а посещаемые сайты и организации, которые управляют вашей сетью, по-прежнему могут наблюдать за вашей активностью.

Разделы ниже отделяют локальные эффекты приватного режима от эффектов, которые проявляются на стороне сайта. Они охватывают различия в хранилище и API, которые может добавить приватный режим, причину, по которой основные сигналы отпечатка остаются прежними, практическое сравнение обычного и приватного сеансов с одним и тем же профилем, а также варианты изоляции, не зависящие от приватного режима. Там же сказано, что обеспечивает BotBrowser и что остаётся на вашей стороне.

Обычное окно и приватное окно используют один и тот же профиль. Сравниваются квота хранилища, доступность API и значения отпечатка, и они должны совпадать. Приватный режим не меняет IP-адрес и то, что видит сайт, а изоляцию даёт отдельный или временный каталог данных.

Смотреть видео

В этом видео на английском языке с помощью локальной лабораторной страницы сравниваются обычное окно и приватное окно (режим инкогнито) в Chrome на машинах с Ubuntu и Windows. Между двумя контекстами различается слой хранилища, а значения оборудования, платформы, языка и сборки, которые читает страница, остаются прежними. Вторая лабораторная страница показывает, что cookie, установленный при первом посещении, отсутствует при втором посещении в новом приватном контексте, а лабораторная подпись повторяется. Видео показывает, что вернули эти машины, а не вердикт для всех браузеров и сайтов. Звук на английском.

TL;DR

  • Приватный режим удаляет локальное состояние после закрытия, но не меняет IP-адрес и сигналы отпечатка устройства.
  • Сравнивайте navigator.storage.estimate(), API страницы и значения отпечатка с одним --bot-profile, прежде чем связывать различие с режимом.
  • Для изоляции используйте отдельный --user-data-dir; сетевую личность и состояние учётной записи решайте отдельно.

Содержание

Что меняет приватное окно и что оно оставляет без изменений

ПоверхностьРезультат приватного сеанса
Локальная история и cookieУдаляются после закрытия последнего приватного окна
Сетевой адресОстаются видны тот же IP и тот же маршрут
Учётная записьСервис по-прежнему узнаёт активную учётную запись
Сигналы устройстваЗначения оборудования и браузера остаются доступными

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

Справка Chrome уточняет, что меняется внутри приватного окна. Chrome не сохраняет данные сайтов и записи о посещённых сайтах после завершения сеанса, сторонние cookies по умолчанию блокируются, а вход в учётные записи автоматически не выполняется. Закладки, которые вы сохраняете, и файлы, которые вы скачиваете, остаются на устройстве. Все эти эффекты локальные. Они описывают, что браузер хранит на вашем компьютере, а не то, что сайт или сеть могут наблюдать, пока вы подключены.

Ограничения важны не меньше, чем польза. IP-адрес, который доходит до сайта, определяется сетью, а не режимом браузера, поэтому приватное окно использует то же соединение, что и любое другое окно на этом компьютере. Работодатели, учебные заведения и интернет-провайдеры, управляющие сетью, по-прежнему видят проходящий через неё трафик. Сайт, на который вы вошли, по-прежнему знает, кто вы. А браузер по-прежнему сообщает каждой загружаемой странице обычный user agent, размер экрана, шрифты, поведение графики и поведение звука, потому что эти значения описывают устройство и сборку браузера, а не сеанс.

  • Локальная история, cookies, данные сайтов и введённые в формы значения удаляются при завершении приватного сеанса.
  • IP-адрес, сетевой маршрут и то, что могут наблюдать управляющие этой сетью, остаются прежними.
  • Учётная запись, в которую вы вошли, остаётся известной сервису, пока вы не выйдете.
  • Сигналы отпечатка описывают устройство и сборку браузера, поэтому остаются прежними.

Иногда слово «приватный» читают как «несвязываемый». Это разные свойства. Несвязываемый означало бы, что сайт не может соединить два визита. Приватное окно означает лишь то, что второй визит не несёт cookies первого. Если одно и то же устройство показывает один и тот же отпечаток в обоих визитах, сайт, собирающий эти сигналы, всё равно может связать их без всяких cookies. Статья о приватном просмотре в повседневной работе описывает бытовую сторону этой границы, а статья о том, что такое снятие отпечатков браузера, объясняет сами сигналы.

Различия в хранилище и API, которые может заметить сайт

ПроверкаКонкретное значение для сравнения
КвотаКвота и использование из navigator.storage.estimate()
Постоянное хранилищеРазрешён запрос или отклонён
IndexedDBКонтролируемая запись и чтение в обоих контекстах
Воркер сервисаРезультат регистрации и срок жизни после закрытия

Поскольку приватный сеанс хранит данные во временном хранилище, браузеры иногда ведут себя в нём немного иначе. В руководстве MDN по квотам хранилища и критериям вытеснения отмечено, что в режиме приватного просмотра, который в Chrome называется режимом инкогнито, а в Edge «InPrivate», браузеры могут применять другие квоты, а сохранённые данные обычно удаляются, когда режим завершается. Страница может прочитать квоту и текущий объём использования для своего источника через navigator.storage.estimate(). Та же страница MDN предупреждает, что этот метод возвращает оценку, а не точное значение, и что браузеры могут искусственно увеличивать размер данных других источников при сообщении общего объёма.

Квота обсуждается чаще всего, но она не единственное различие. С годами браузеры меняли то, как некоторые интерфейсы, связанные с хранилищем, отвечают в приватном режиме. Примеры: старые интерфейсы файловой системы, ответы на запросы постоянного хранилища, регистрация сервис-воркеров и их сохранение, а также поведение IndexedDB, когда она не может писать на диск. Эти детали различаются по браузерам и версиям, и поведение, существовавшее в одном выпуске, может исчезнуть в следующем. Относитесь к любому такому различию как к тому, что может существовать, а не как к правилу, действующему везде.

Кроме того, каждый браузер делает собственный выбор квоты даже вне приватного режима. MDN приводит разные ограничения для Firefox, Chrome и Safari, выраженные как разные доли общего дискового пространства, и отмечает, что цифры зависят от способа использования хранилища. Этот разброс отчасти объясняет, почему одиночное значение квоты является слабым сигналом. Малое значение может прийти из приватного сеанса, из почти заполненного диска, из встроенного веб-представления или из браузера, который просто задаёт более низкий предел.

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

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

Почему сигналы отпечатка остаются прежними в приватном режиме

Группа сигналовИсточник вне приватного профиля
ГрафикаРендеринг и рисование в стеке браузера и ОС
АудиоРезультат аудиопроверки версии браузера
ШрифтыУстановленный набор и поведение подстановки
ЭкранРазмеры экрана и коэффициент пикселей устройства

Отпечаток браузера представляет собой сочетание значений, которые описывают устройство и сборку браузера. Сюда входит то, как графический стек рисует фигуры и текст, как звуковой стек обрабатывает тестовый сигнал, какие шрифты установлены, размеры экрана и соотношение пикселей, число логических процессоров, строка платформы и список языков. Ни одно из этих значений не хранится в папке профиля, которую заменяет приватный режим. Они берутся из оборудования, операционной системы и версии браузера и одинаковы независимо от того, приватное окно или нет.

Поэтому обычный визит и приватный визит с одного компьютера можно связать. Допустим, человек просматривает магазин в обычном окне, затем открывает приватное окно и возвращается в тот же магазин, чтобы избежать рекомендаций, которые вызвали бы cookies. Cookies исчезли. Отпечаток остался. Сайт, который записывает значения отпечатка для защиты от мошенничества или для аналитики, видит два визита с совпадающими значениями и вправе считать их одним устройством.

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

У расширений, которые обещают вернуть приватность внутри приватных окон, есть похожее ограничение. Инструмент, который изменяет несколько значений в скриптах страницы, должен согласовать с изменёнными значениями все остальные ответы, а сами изменения могут быть заметной странностью. Отпечаток, противоречащий самому себе, часто более заметен, чем обычный. Это повод рассматривать среду браузера как единое целое, а не как список независимых значений.

Вывод для приватного режима прост. Он решает один класс распознавания, зависящий от сохранённого состояния, такого как cookies. Он не решает распознавание, зависящее от того, что сообщают устройство и браузер. Когда задаче нужен контроль над вторым классом, приватное окно оказывается неподходящим инструментом, а подходящим является сознательно выбранный и внутренне согласованный профиль.

Сравнение обычного и приватного сеансов по шагам

Переменная, которую держат постояннойЧто записать до сравнения
Браузер и профильВерсия, файл --bot-profile и параметры запуска
ХранилищеКвота, использование и результат постоянного хранилища
API страницыСервис-воркер, IndexedDB, локальное хранилище и Cache API
ПерезапускТе же значения после закрытия всех окон

Когда нужно узнать, выглядят ли два сеанса одинаково для страницы, письменное сравнение лучше догадок. Шаги ниже предполагают одну сборку браузера и один профиль, так что единственной переменной остаётся режим сеанса. Используйте страницу, которую вы контролируете, или публичный просмотрщик отпечатков, которому вы доверяете, и берите одну и ту же страницу для обоих запусков.

  1. Зафиксируйте исходные условия. Запишите версию браузера, операционную систему, имя файла профиля и параметры запуска. Сравнение имеет смысл, только если всё это одинаково в обоих запусках.
  2. Откройте обычный сеанс и прочитайте квоту хранилища и объём использования, которые сообщает navigator.storage.estimate(). Отметьте, предоставлено ли постоянное хранилище.
  3. Откройте приватный сеанс с тем же профилем и прочитайте те же значения с той же страницы. Значения должны совпадать с поправкой на изменения объёма, вызванные данными, записанными во время запуска. Такое совпадение ожидается с профилем BotBrowser; в немодифицированном браузере квоты в приватном режиме могут отличаться.
  4. Сравните доступность сервис-воркеров, IndexedDB, локального хранилища и Cache API. В обоих сеансах каждый интерфейс должен присутствовать и одинаково отвечать на простую тестовую запись.
  5. Сравните значения отпечатка, которые сообщает ваш просмотрщик, например графический отрисовщик, результат обработки звука, список шрифтов, значения экрана и список языков. Любое различие между сеансами должно объясняться режимом, а не изменённым профилем или параметром.
  6. Повторите после перезапуска. Закройте все окна, запустите снова с тем же профилем и выполните то же сравнение. Результаты, меняющиеся от запуска к запуску, указывают на проблему конфигурации, а не на стабильное свойство.

Читайте результаты по категориям. Если квота отличается, а значения отпечатка совпадают, различие приходит из слоя хранилища. Если значения отпечатка отличаются, прежде чем искать дальше, убедитесь, что оба сеанса используют один профиль и одни и те же параметры. Если сервис-воркеры регистрируются в одном сеансе и не регистрируются в другом, запишите версию браузера, потому что поведение, нормальное для немодифицированного браузера, всё равно может проявиться как различие в сравнении. Храните заметки рядом с именем профиля, чтобы следующее обновление браузера можно было сопоставить с ними.

Сохраняйте условия проверки стабильными. Используйте один и тот же размер окна, одни и те же расширения или никаких, и сопоставимый объём свободного места на диске, потому что каждый из этих факторов может сместить значение по причинам, не связанным с режимом. Цифры квоты и использования являются оценками, поэтому сравнивайте их так, чтобы допускать небольшие изменения, а крупный повторяющийся разрыв между двумя сеансами считайте находкой, которую стоит изучить.

Помните об ограничениях этой проверки. Она сравнивает один сеанс с другим. Она не показывает, как конкретный сайт оценивает визит, и чистый результат не гарантирует, что сайт примет сеанс. Сайт может также использовать сигналы, которых эта проверка не охватывает, включая IP-адрес, историю учётной записи и поведение во времени. Считайте совпадение свидетельством того, что приватный режим не добавил лишних различий, и не более того.

Запись сравнения, к которой можно вернуться

Поле в файлеПочему оно входит в запись
modeМетка, которую вы ставите сами; страница её прочитать не может
quota и usageРеально возвращённые значения хранилища
persistentВыдано разрешение или отклонено
apisПо одному логическому значению на интерфейс

Заметки во вкладке исчезают в момент закрытия окна, а режим, который вы сравнивали, и есть то, что отбрасывается. Небольшой JSON-файл на каждый запуск переживает перезапуск и даёт следующему обновлению браузера точку сопоставления. Скрипт ниже читает только те значения, которые доступны самой странице, поэтому одинаково работает и на вашей лабораторной странице, и на просмотрщике отпечатков, которому вы доверяете.

display-mode не является признаком режима приватности: и обычное, и приватное окно соответствуют browser, а значение приложения вроде standalone даёт только установленное окно приложения. Скрипт записывает найденное значение, поэтому поле описывает, как отображается страница, а не режим приватности. mode ставите вы сами, один раз на запуск. Остальное в записи читается со страницы.

// выполните в обоих сеансах, затем скопируйте напечатанный JSON в два файла
const record = { mode: 'regular' }; // set this to 'private' in the private window
const est = await navigator.storage.estimate();
record.displayMode =
  ['browser', 'standalone', 'minimal-ui', 'fullscreen', 'window-controls-overlay'].find(
    m => window.matchMedia(`(display-mode: ${m})`).matches
  ) ?? 'none';
record.quota = est.quota;
record.usage = est.usage;
record.persistent = await navigator.storage.persisted();
record.apis = {
  serviceWorker: 'serviceWorker' in navigator,
  indexedDB: 'indexedDB' in window,
  localStorage: 'localStorage' in window,
  caches: 'caches' in window,
};
console.log(JSON.stringify(record));

Назовите файлы по сеансу, например regular.json и private.json, и сравните их. Diff двух записей с одним профилем должен показать только usage, и только если первый запуск записал данные, которых второй ещё не записал. Любое другое различающееся поле является находкой, которую надо объяснить, а не шум, который можно усреднить.

Две детали делают запись сопоставимой. Читайте navigator.storage.estimate() до того, как что-либо ещё запишете в хранилище, потому что сама запись меняет usage. И указывайте рядом с файлом сборку браузера: изменение квоты между двумя версиями браузера ожидаемо, а между двумя сеансами одной сборки такого ожидания нет.

Разбор расхождения в фиксированном порядке

ПорядокЧто проверить до того, как винить режим
1Оба запуска использовали один файл --bot-profile
2Оба запуска получили одинаковые параметры --bot-*
3Ни один не менял размер окна и расширения
4Страница и просмотрщик были одной сборки

Большинство расхождений происходит из-за переменной, которая сместилась между запусками, а не из-за самого приватного режима. Работа в фиксированном порядке не даёт заново запустить сравнение, не проверив входные условия, которые и делают его сравнением. Сначала сравните два файла записи, затем две строки запуска, и только потом поведение браузера.

Начните с файла профиля. --bot-profile принимает путь, и два сеанса, направленные на разные файлы, задают разные квоты и разные поверхности отпечатка, поэтому расхождение на этом шаге означает сломанное сравнение, а не находку о браузере. Сравнивайте разрешённые абсолютные пути, а не строки, набранные в двух разных оболочках.

Затем параметры. Сеанс, который добавил параметр --bot-* для одного запуска и не добавил для другого, сравнивает две конфигурации. Выведите действующую командную строку обоих запусков и сравните её. То же правило покрывает различия окружения, меняющие запуск, например переменную прокси, заданную только в одной оболочке.

Затем переменные представления. Размер окна, соотношение пикселей устройства, установленные расширения и свободное место на диске: каждое смещает какое-то значение, и ни одно из них не определяется режимом просмотра. Держите их постоянными или записывайте рядом с результатом, чтобы различие можно было отнести к причине.

Только после этих трёх проверок имеет смысл смотреть на браузер. Если профиль, параметры и представление идентичны, а поле всё равно различается, это различие стоит сообщить вместе с двумя файлами записи, двумя командными строками и сборкой браузера. Именно такой отчёт делает находку пригодной к работе, а не анекдотичной.

Зафиксируйте порядок письменно и используйте его повторно. Список разбора, который меняет форму от расследования к расследованию, даёт списки, которые нельзя сопоставить; это та же проблема, что и сравнение двух сеансов в разных условиях.

Выберите изоляцию, не зависящую от приватного режима

Если на самом деле нужны сеансы, которые не делят и не сохраняют данные, эту задачу напрямую решает каталог пользовательских данных. Браузеры на основе Chromium хранят cookies, локальное хранилище, IndexedDB и кэши в каталоге, заданном параметром --user-data-dir. Если направить каждый сеанс в свой каталог, сеансы остаются разделёнными, а новый временный каталог после удаления ничего не оставляет. Это даёт ту же локальную непостоянность, что и приватный режим, но без различий, присущих самому режиму, которые пришлось бы сравнивать.

# один сеанс со своим временным каталогом данных
chromium-browser --bot-profile="path/to/profile.enc" \
                 --user-data-dir="$(mktemp -d)"

Выбирайте по назначению. Отдельный каталог для каждой учётной записи разделяет cookies, состояние входа и локальные данные, а именно это нужно при работе с несколькими учётными записями. Временный каталог подходит для разовой задачи, которая не должна ничего оставлять на диске. Постоянный каталог подходит для сеанса, который должен пережить перезапуски. Статья об изоляции браузера для нескольких учётных записей описывает, как планировать такие границы. Во всех случаях каталог лишь определяет, что сохраняется. Он не определяет, как выглядит отпечаток, поэтому профиль по-прежнему выбирается отдельно.

Удаляйте временные каталоги, когда задача завершена. Скрипт, который создаёт каталог, должен и удалять его, а человек, создавший каталог вручную, не должен использовать его для другой задачи. Повторное использование каталога лишает смысла весь подход, потому что cookies и данные сайтов первой задачи окажутся доступны второй.

Сетевая идентичность это ещё один слой. Ни приватное окно, ни каталог данных не меняют IP-адрес. Сайт, который видит один и тот же адрес в разных сеансах, может связать их независимо от хранилища. Если для вашей задачи важна отдельная сетевая идентичность, настройте прокси для этого сеанса осознанно и проверьте, что его расположение, язык и часовой пояс согласуются с профилем. Cookies, отпечаток и IP-адрес это три отдельные поверхности, и каждая требует собственного решения.

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

Что охватывает BotBrowser и что остаётся за его пределами

BotBrowser может сохранять согласованными поверхности отпечатка, значения квоты хранилища и поведение API хранилища между обычным сеансом и сеансом в режиме инкогнито для одного и того же профиля, и документация BotBrowser по режиму инкогнито описывает это поведение. Для приведённого выше сравнения это означает, что приватный контекст не должен показывать дополнительных различий в хранилище или API по сравнению с обычным, поэтому расхождение является поводом проверить профиль и параметры, а не чем-то, что нужно принять. BotBrowser не может сделать так, чтобы приватный просмотр скрывал IP-адрес или активность на стороне сайта, не может контролировать, как сайт оценивает или сопоставляет другие сигналы, и не заменяет настройку прокси и выбор учётных записей.

Документация также описывает --bot-enable-variations-in-context, параметр для заголовка X-Client-Data, который получают домены Google в контекстах инкогнито. Он указан как функция ENT Tier2 и по умолчанию отключён. Большинству читателей он не нужен для сравнения из этой статьи, но он показывает, что работа над согласованностью распространяется на детали за пределами хранилища.

Для практического начала запустите BotBrowser с профилем, выполните сравнение из предыдущего раздела и ожидайте, что обычный и приватный контексты совпадут. Если они не совпадают, применимы рекомендации по устранению неполадок из документации: убедитесь, что оба сеанса используют один и тот же --bot-profile и одни и те же параметры --bot-*, потому что другой профиль может задавать другие значения квоты. Изоляция сеансов остаётся вашим решением, а описанные выше варианты каталога данных позволяют её обеспечить.

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

Итоги

Считайте приватный режим очисткой локального сеанса, а не изменением сетевой или аппаратной личности. Полезное сравнение сохраняет один профиль, версию браузера и страницу, записывает результаты API и хранилища, а отдельный каталог данных или proxy выбирается только для нужной границы.

Открытые источники

#Incognito#Private-Browsing#Detection#Identity#приватность

Эта статья входит в руководство: Поверхности идентичности браузера: обзор согласованности

Переведите BotBrowser из исследований в продакшн

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