Подмена user-agent может сузить множество анонимности и выдать несоответствия — парадокс энтропии, и когда подмена всё же помогает.
Сменить user-agent кажется очевидным шагом к приватности: скажите сайту, что вы используете другой браузер, — и он не сможет вычислить настоящий. На практике часто выходит наоборот. Подменённый user-agent может сделать ваш браузер более редким, чем тот честный, который он заменил, и он почти всегда расходится с чем-то ещё, что выдаёт ваш браузер, — а обе эти проблемы упрощают вашу идентификацию, а не усложняют её. Это не повод никогда не трогать user-agent — это повод понять, что подмена меняет на самом деле, прежде чем на неё полагаться.
Ключевые выводы
- Риск — в редкости, а не во лжи. Подменённый user-agent, который встречается у немногих других посетителей, может добавить больше идентифицирующей энтропии, чем настоящий, — почему так, объясняет математика энтропии и множества анонимности.
- Строка редко путешествует одна. User-Agent Client Hints,
navigator.userAgentDataи десятки поведений на уровне движка продолжают выдавать ваш настоящий браузер даже после смены строки, создавая противоречие, которое скрипт может пометить как «ложь». - Обнаружению не нужно доказывать ложь — достаточно одного сигнала, который расходится с заявленной личностью, а именно так сайты сегодня обнаруживают подмену user-agent.
- Подмена помогает, только если она сдвигает вас к распространённой, внутренне согласованной личности — а не к случайной или необычной.
- Единообразие побеждает рандомизацию. Инструменты, делающие всех пользователей одинаковыми, уменьшают суммарную энтропию толпы; инструменты, делающие одного пользователя непохожим на остальных, лишь меняют, кто именно выделяется.
Что на самом деле меняет смена user-agent
Строка user-agent — это одна строка текста, которую браузер отправляет с каждым запросом, объявляя своё имя, версию и платформу. Расширение или настройка в DevTools могут свободно переписать эту строку — ничто не мешает вам сказать серверу, что вы работаете в Safari на iPhone, находясь за десктопом на Windows с Chrome. А вот переписать всё остальное они не могут. Движок рендеринга, среда выполнения JavaScript, набор HTTP-заголовков, TLS-рукопожатие и десятки других наблюдаемых свойств продолжают вести себя точно как настоящий браузер, потому что ни одно из них не читает подменённую строку, чтобы решить, как действовать. Вы изменили одно заявление о своей личности, пока куда более обширный массив улик продолжает свидетельствовать об истине.
Парадокс энтропии: проблема — в редкости, а не во лжи
Устойчивость к фингерпринтингу — это не про сокрытие информации, а про то, чтобы не выделяться. Как объясняет разбор энтропии и множества анонимности, каждый атрибут, который может считать скрипт, вносит биты энтропии пропорционально тому, насколько редко его значение: распространённые значения обходятся дёшево, редкие — дорого, а биты независимых сигналов складываются. Первоначальное исследование Panopticlick от EFF показало, что одна лишь строка user-agent несёт около 10 бит энтропии — заметная часть тех ~33 бит, что делают отпечаток уникальным на Земле (см. резюме результатов Panopticlick от EFF).
Правда, эти 10 бит — исторический максимум, а не сегодняшняя величина. Сокращение User-Agent в Chrome с тех пор урезало строку до грубой и по большей части замороженной формы, так что честная современная строка Chrome несёт куда меньше энтропии, чем в 2010 году. Для подмены это делает размен хуже, а не лучше: честная строка, которую вы собираетесь заменить, теперь необычайно дёшева, а любое значение, не совпадающее с той сокращённой формой, которую ему полагается иметь, — необычайно дорого.
Именно здесь подмена идёт не так. Если вы подделываете user-agent, который предъявляют немногие другие посетители, — устаревшую версию браузера, редкую сборку ОС, несоответствующий класс устройства, — вы не избавляетесь от этого вклада в энтропию. Скорее всего, вы его увеличиваете, потому что редкая заявленная личность по определению сужает круг людей, которыми вы правдоподобно могли бы оказаться. Выбор популярной, актуальной, ничем не примечательной строки браузера — единственный вариант подмены, который не добавляет биты обратно, — и даже он срабатывает только если остальная часть вашего отпечатка не противоречит ему тут же, а это уже следующая проблема.
Обнаружение несогласованности: когда история не сходится
Даже удачно подобранная, распространённая строка user-agent должна пережить сверку со всем остальным, что раскрывает ваш браузер, — и именно на этой проверке проваливается большинство попыток подмены.
User-agent против Client Hints
Браузеры на Chromium предоставляют User-Agent Client Hints через navigator.userAgentData — структурированный, читаемый из скрипта источник тех же фактов о браузере и платформе, что несёт строка user-agent, но доступный через совершенно отдельный API. Большинство инструментов подмены user-agent патчат строку и на этом останавливаются, оставляя navigator.userAgentData сообщать о настоящем бренде Chromium и платформе под user-agent, который теперь заявляет о себе как Firefox или Safari, — а эти браузеры вообще не предоставляют userAgentData. Сервер или скрипт, читающий оба источника, видит браузер, заявляющий одно, тогда как отдельный, куда более трудный для подделки API настаивает на другом. Одного этого несоответствия часто достаточно, чтобы пометить сессию, — поэтому это одна из ключевых техник, разобранных в статье о том, как сайты обнаруживают подмену user-agent.
Флаги «лжи» и проверки по нескольким сигналам
Исследовательские инструменты фингерпринтинга формализуют эту идею напрямую. Вместо того чтобы прочитать значение один раз, они считывают один и тот же базовый факт по нескольким разным путям — свойство против производного поведения, результат в основном потоке против того же вычисления где-то ещё — и помечают расхождение как ложь. Именно на этой модели построены проекты вроде CreepJS, которые оценивают согласованность браузера, а не его уникальность (общий механизм разобран в статье о том, как детектор лжи ловит подмену). Подменённый геттер navigator.userAgent — как раз тот тип переопределения, который такого рода проверки и созданы выявлять: строка говорит одно, а десяток других путей к тому же факту продолжают говорить другое.
Когда подмена помогает, а когда вредит
Эффект подмены целиком зависит от того, в какую сторону она вас сдвигает — к толпе или от неё.
| Сценарий | Эффект на ваше множество анонимности |
|---|---|
| Подмена на редкую или устаревшую строку браузера | Сужает его — теперь вы совпадаете с меньшей, более необычной группой |
| Подмена на популярную, актуальную строку, совпадающую с поведением реального движка | Примерно нейтрально, если ничто другое не противоречит |
| Подмена только строки, без изменения Client Hints / поведения движка | Сужает его — само несоответствие становится редким, идентифицирующим сигналом |
| Тестирование/проверка совместимости (просмотр мобильной вёрстки, QA) | Нормально — вы не пытаетесь обойти отслеживание, а просто проверяете рендеринг |
| Рандомизация строки для каждой сессии или сайта | Сужает его — несогласованная личность между визитами сама по себе является уликой |
Во всех строках таблицы закономерность одна: подмена не добавляет энтропию только тогда, когда результат одновременно распространён и внутренне согласован. Всё, что делает вас более редким или противоречит другому сигналу, работает против той самой цели, ради которой затевалось.
Принцип «слиться с толпой»
Именно поэтому самые эффективные инструменты защиты от фингерпринтинга строятся на единообразии, а не на рандомизации по одному сигналу за раз. Режим resistFingerprinting в Firefox и Tor Browser не пытаются скрыть ваш user-agent — они стандартизируют его вместе с часовым поясом, размером экрана и выводом canvas, приводя к одним и тем же сообщаемым значениям для всей своей аудитории. Если все пользователи режима сообщают идентичный набор значений, этот набор несёт почти нулевую энтропию — независимо от того, насколько он отличается от «настоящей» конфигурации под ним. Рандомизация же одного отдельного сигнала своими силами может дать осечку так же, как и подмена: странно случайный хеш canvas или user-agent, меняющийся между визитами, сам по себе является обнаружимой закономерностью — эта проблема подробно разобрана в статье «Canvas-шум против хеша: почему рандомизация даёт осечку». Урок распространяется и за пределы canvas: изменение одного сигнала в изоляции, без большой группы людей, которая делает ровно то же самое, обычно лишь меняет один вид заметности на другой.
Проверьте свой браузер
Вам не нужно принимать всё это на веру — несоответствие можно увидеть самостоятельно. Подмените user-agent расширением или эмуляцией устройства в DevTools, затем откройте консоль и сравните navigator.userAgent с navigator.userAgentData: в Chromium второе продолжает сообщать ваш настоящий браузер независимо от того, что теперь заявляет первое. Проверка отпечатка браузера от BrowserInsight показывает полный набор сигналов, которые скрипт мог бы объединить, а проверка ядра браузера напрямую сравнивает заявленную личность с вашим реальным движком рендеринга. Для более широкого сравнения «до/после» вашего множества анонимности инструмент Cover Your Tracks от EFF выдаёт оценку «1 из X» относительно собственного агрегированного набора данных — запустите его с включённым и выключенным инструментом подмены, чтобы увидеть, в какую сторону он реально вас сдвинул.
Часто задаваемые вопросы
Значит, мне никогда не стоит менять user-agent?
Не «никогда» — просто не как самостоятельный инструмент приватности. Подмена ради тестирования совместимости или просмотра мобильной вёрстки — это нормально, ведь вы не пытаетесь обойти отслеживание. А как мера приватности одинокая подменённая строка без согласованных с ней Client Hints и поведения движка обычно добавляет идентифицирующую энтропию, а не убирает её.
Значит ли это, что расширения приватности, меняющие user-agent, — это плохо?
Не обязательно — всё зависит от того, меняют ли они всю личность согласованно. Хорошо спроектированный инструмент координирует user-agent, Client Hints и связанные сигналы вместе и стремится к общей, разделяемой конфигурации. Инструмент, который патчит только строку или рандомизирует её при каждом визите, обычно ухудшает ситуацию именно теми способами, что описаны выше.
Парадокс энтропии отпечатка характерен только для подмены user-agent?
Нет — он применим к любому сигналу. Рандомизация хеша canvas, разрешения экрана или списка шрифтов даёт тот же сбой, если рандомизированное значение редкое или не согласуется со всем остальным. User-agent — это просто тот сигнал, к которому большинство обращается в первую очередь и который легче всего подделать неудачно.
Что на самом деле уменьшает мой отпечаток, если не подмена?
Стандартизация, а не маскировка. Браузеры и режимы, спроектированные так, чтобы огромное число пользователей сообщало идентичные значения, — Tor Browser, resistFingerprinting в Firefox — по-настоящему уменьшают энтропию среднего пользователя, потому что толпа, с которой вы сливаетесь, реальна и велика. Полный набор сигналов, которые приходится координировать этим инструментам, — в полном руководстве по фингерпринтингу.
Заключение
Строка user-agent — это одна строка среди десятков сигналов, и изменение её в изоляции не убирает информацию — оно лишь добавляет новую: держится ли заявление вместе со всем остальным. Редкая подменённая личность сама по себе сужает ваше множество анонимности; несогласованная — даёт детектору готовый повод вас пометить. Те варианты «подмены», которые реально помогают, — это те, что перестают выглядеть подменой вообще: совпадение с большой, распространённой, внутренне согласованной конфигурацией — тот же принцип, что лежит в основе любого по-настоящему работающего инструмента защиты от фингерпринтинга.
Рекомендуем прочитать:


