Сравнение
Страница, расширение или движок
Три глубины одной правки
Значение, которое читает сайт, правят в трёх местах. В странице поверх готового ответа, в расширении, которое приходит к странице раньше, или в движке, который этот ответ и выдаёт.
Это не три степени одного и того же. Они отличаются тем, со сколькими вещами правке придётся сойтись.
В странице
Свойство подменяется после того, как браузер уже приготовил свой ответ.
В расширении
Та же подмена, доставленная до того, как страница исполнит свой первый скрипт.
В движке
Значение таким и выдаётся, поэтому подменять уже нечего.
Что приходит поверх готового ответа
Скрипт, положенный в собственный мир страницы на её начале, это самое раннее, чем может быть страничный слой, и он правда успевает раньше первого вопроса.
И всё равно это поправка поверх значения, которое браузер уже выдал. Подлинник никуда не девается: он остаётся доступен всюду, куда поправка не дотянулась.
Что отвечает второй мир
Странице необязательно спрашивать документ. Она может открыть фоновый поток или невидимый кадр и прочитать устройство там.
Страничный слой закрывает только те миры, в которые его поставили. Замерено на таком слое: документ отвечал профилем, а фоновый поток отвечал машиной под ним.
Документ
Мир, который читает любая простая проверка, и первое, что закрывает страничный слой.
Невидимый кадр
Дочерний мир со своей копией тех же объектов.
Фоновый поток
Мир без документа, куда поправка, написанная для документа, не достаёт.
Восемь способов по своей глубине
Таблица читается как границы работы, а не как оценка. Пустая клетка значит, что вопрос к этому способу не относится.
Последняя строка наша. Каждая клетка в ней взята из кода, который можно открыть, или из приёмки собранного движка.
| Где идёт правка | Когда она успевает | Что читает поток или кадр | Чего стоит ошибка | |
|---|---|---|---|---|
| Обычный браузер как есть | Правки нет | То же, что и документ | Ошибаться нечем | |
| Режим инкогнито | В хранилище, а не в устройстве | Когда открывается окно | Собственные ответы машины | Ошибаться нечем |
| Отдельные профили того же браузера | В каталоге данных на диске | При запуске | Собственные ответы машины | Ошибаться нечем |
| Расширение, подменяющее значения в странице | В странице, поверх настоящего ответа | До первого скрипта самой страницы | Куда слой дотянулся, а в остальном машину | Перезапуск на починку и подменённое свойство на виду |
| VPN | На дороге, вне браузера | До первого ушедшего запроса | Показания устройства не тронуты | Переподключиться через другой выход |
| Виртуальная машина на аккаунт | В гостевой системе, ниже браузера | До запуска браузера | Ответы гостя, во всех мирах | Пересобрать образ и загрузиться заново |
| Отдельное железо на аккаунт | Нигде: отвечает сама машина | Ответы машины, во всех мирах | Ошибаться нечем | |
| Браузер с правкой самого движка | Внутри движка, на C++ | До того, как появится первый ответ | То же, что и документ | Пересборка на часы, а объявленное и не собранное показание отдаст хозяйское значение |
Чем оплачен ответ изнутри
Глубина оплачивается временем сборки. Правка внутри движка это сборка браузера под каждую систему, то есть часы, а не перезапуск.
Оплачивается она и учётом. Сборка записывает, какие показания она и правда несёт, разыскивая каждое в том дереве исходников, которое только что собрала.
Список замеряется, а не переписывается
Каждое показание доказано признаком, найденным в дереве в минуту сборки.
Молчание значит, что не закрыто ничего
Сборка, не объявившая ничего, читается как ничего не закрывающая, и страница закрывает всё.
Страница отходит по одному показанию
Что сборка объявила, то страница больше не поправляет, и две поправки не встречаются.
Где выигрывает мелкий слой
Глубина нужна не всегда. Чтобы перекрыть запрос, страница и не нужна: правило внутри сетевого слоя срезает его, и странице при этом не видно ничего.
Браузер, который у вас уже есть, это настоящее преимущество, когда аккаунт один. Глубокий слой окупается там, где многим аккаунтам надо оставаться врозь на одной машине.
Чего это сравнение не утверждает
- Не утверждает, что глубина решает исход. Аккаунт читают ещё по поведению и по истории, и их не трогает ни один слой.
- Не описывает ни одного названного изделия. Здесь сравниваются способы работы, а мерить чужую сборку мы не берёмся.
- Не каждое показание отвечает сегодня изнутри движка. Чего сборка не объявила, то по-прежнему поправляется из страницы, и такая поправка оставляет подменённое свойство, а движок не оставляет ничего.
- Не изолирует так глубоко, как гостевая система. Профили это процессы на вашем собственном ядре, и это ядро они делят друг с другом и с вами.
- Замеры сняты на нашей сборке и одной машине. Другая машина даст другие строки.
Как это проверить
За каждым утверждением выше стоит файл, а за большинством ещё и стенд, который исполняет код, а не пересказывает его.
- Список того, что закрывает сборка, читается рядом с двоичным файлом, а его отсутствие читается как пустота
- apps/desktop/src/lib/forkEngine.js
- Один файл решает, что ещё закрывает страница, и стенд исполняет это решение
- apps/desktop/src/lib/дыры-страницы.js · apps/desktop/test/страница-отходит-когда-движок-умеет.js
- Каждое показание, объявленное сборкой, доказано признаком в дереве исходников
- engine/scripts/опись-умений.js · packages/shared/src/index.js · apps/desktop/test/engine-patches-real.js
- Документ, кадр и поток читаются порознь и сверяются между собой
- apps/desktop/src/lib/fpAudit.js · apps/desktop/test/fingerprint-realms.js · engine/приёмка-отчёт.json
Вопросы
- Расширение приходит раньше первого скрипта страницы. Почему этого мало?
- Потому что ответ, который оно правит, уже есть. Всюду, куда поправка не дотянулась, подлинник остался на месте, и два ответа на один вопрос говорят больше, чем один странный ответ.
- Почему не перенести все показания в движок разом?
- Сборка занимает часы на каждую систему, поэтому показания приходят порциями. Чего в нынешней сборке нет, то до её выхода закрывается из страницы.
- Откуда программа знает, что закрывает сборка?
- Она читает короткий список, который сборка кладёт рядом с двоичным файлом. Пропавший или порченый список читается как пустой, и это безопасная сторона ошибки.
- Могут ли две поправки лечь на одно показание?
- Нет. Один файл решает, что страница ещё закрывает, и показание, объявленное сборкой, из этого списка уходит.
- Видно ли подменённое свойство?
- Страничный слой прячет себя, и подменённая функция по-прежнему читается как встроенная, а самопроверка на этом настаивает. Значению, выданному внутри движка, прятать нечего.
Читать дальше
Согласие частей одного отпечатка
Те же восемь способов по тому, складываются ли части в одну машину.
Движок
Что собранный движок отвечает изнутри, показание за показанием.
Надстройка скрытности
Правка изнутри страницы и её потолок.
Утечка через поток
Почему фоновый поток спрашивают отдельно от документа.
Как идёт запуск
От нажатия до первого скрипта, по порядку.
Узнайте, на каком слое ваш браузер
Проверка снимает 12 показаний в вашем браузере и никуда их не отправляет.