Что screen.width, availHeight и devicePixelRatio сообщают странице о дисплее, почему дают мало бит и как letterboxing в Tor их скрывает.
Любая открытая вами страница может узнать, насколько велик ваш дисплей, сколько места операционная система оставляет свободным и сколько физических пикселей приходится на один CSS-пиксель. Запрос разрешения для этого не нужен. Сам по себе результат — распространённое значение с низкой энтропией, но это один из самых дешёвых сигналов, которые трекер добавляет к более крупному отпечатку, и один из самых простых для перекрёстной проверки детектором.
Главное
- Страница без запросов читает
screen.width,screen.height,screen.availWidth,screen.availHeight,screen.colorDepthиwindow.devicePixelRatio. availHeightобычно меньшеheight, потому что место занимают панель задач, Dock или строка меню; эта разница раскрывает часть устройства рабочего стола.devicePixelRatioменяется вместе с масштабированием дисплея и зумом браузера, поэтому описывает вашу текущую настройку, а не только железо.- Значения экрана по отдельности имеют низкую энтропию. Важны они тем, что перемножаются с GPU, шрифтами и платформой, как показывает арифметика анонимных множеств.
- Защита работает так: всех раскладывают по нескольким «корзинам» — letterboxing в Tor Browser и округление в режиме resist-fingerprinting Firefox.
Что может прочитать страница
Интерфейс Screen на MDN перечисляет свойства дисплея, на котором находится окно. В фингерпринтинге используются:
| Свойство | Что сообщает |
|---|---|
screen.width / screen.height | Размер экрана в CSS-пикселях |
screen.availWidth / screen.availHeight | Доступное странице место за вычетом элементов интерфейса ОС, например панели задач |
screen.colorDepth | Число бит на пиксель для цвета |
window.devicePixelRatio | Отношение физических пикселей к CSS-пикселям |
window.innerWidth / outerWidth (и высоты) | Размер области просмотра и всего окна браузера |
Размеры окна определены в W3C CSSOM View Module вместе со свойствами экрана. Обратите внимание: width и height — в CSS-пикселях, а не в аппаратных. Ноутбук с физической матрицей 2880×1800 и коэффициентом 2 обычно сообщает 1440×900.
Почему доступный размер отличается от полного
Страница MDN про availWidth описывает значение как ширину экрана за вычетом постоянно отображаемых элементов интерфейса, например панели задач. То же верно для availHeight. Поэтому экран 1920×1080 с availHeight 1040 говорит, что зарезервировано около 40 пикселей высоты — возможно, под панель задач. Автоскрываемый Dock или строка меню на другом краю дадут другие числа.
Эта разница — небольшая, но реальная утечка о том, как устроен рабочий стол. Двое пользователей с одинаковыми мониторами всё равно могут различаться здесь из-за размера, положения или автоскрытия панели задач. Значения для каждой ОС мы не приводим: они меняются между версиями ОС и пользовательскими настройками.
devicePixelRatio: масштабирование просвечивает
Страница MDN про devicePixelRatio определяет его как отношение разрешения в физических пикселях к разрешению в CSS-пикселях для текущего устройства отображения. Двигают его две вещи:
- Масштабирование дисплея. Монитор 4K с масштабом 150% в настройках ОС сообщает другой коэффициент, чем тот же монитор при 100%.
- Зум браузера. Во многих настольных браузерах зум меняет коэффициент, потому что меняется число пикселей устройства на один CSS-пиксель. MDN отмечает, что зум влияет на значение, поэтому два визита с одной машины могут дать разные числа.
Так что это сигнал о вашей текущей конфигурации. Он также помогает отличить браузер на экране высокой плотности от обычного, чего одним screen.width не сделать.
Зачем он нужен трекеру
Экран 1920×1080 есть у очень большой доли пользователей ПК, поэтому одно значение оставляет вас в большой толпе. Риск — в умножении. Каждый независимый атрибут сужает толпу, а геометрия экрана не зависит от рендерера GPU, списка шрифтов и часового пояса. Руководство по фингерпринтингу браузера показывает место данных об экране среди других сигналов, а энтропия и анонимные множества — как складываются несколько бит с низкой энтропией.
У него есть и два свойства, которые нравятся трекерам. Он пассивен: не нужны ни опрос API, ни тест отрисовки — только чтение свойств. И он дёшев: выполняется мгновенно и не создаёт заметной задержки.
Необычные значения заметнее. Редкий размер монитора, дробный коэффициент из-за нестандартного масштаба или размер окна, которого не даёт ни один стандартный монитор, сужают толпу гораздо сильнее обычной панели 1080p. О том, как ведут себя телефоны с их многообразием коэффициентов, рассказывает статья фингерпринтинг мобильных браузеров.
Размер окна — отдельный сигнал
Страница читает не только размер экрана, но и размер области просмотра и окна браузера. Они меняются при изменении размера, привязке к краю или открытии инструментов разработчика, поэтому скорее идентифицируют сеанс, чем устройство. Они же немного раскрывают контекст: область просмотра уже экрана намекает, что окно не развёрнуто. В статье про фингерпринтинг по CSS media queries показан родственный путь: CSS-запросы раскрывают похожую геометрию без чтения screen скриптом.
Несколько экранов и Window Management API
При нескольких мониторах базовый объект screen описывает только тот дисплей, на котором находится окно. Window Management API задуман, чтобы страница могла получить сведения обо всех подключённых дисплеях и размещать окна между ними. По описанию MDN, он закрыт разрешением, так что это не сигнал «без запроса», как свойства выше. О том, какие браузеры его поддерживают, мы ничего не утверждаем; смотрите таблицу совместимости на этой странице для нужных вам браузеров.
Проверка на согласованность
Значения экрана должны соответствовать устройству, за которое выдаёт себя браузер. Мобильный user agent с экраном 2560×1440 и коэффициентом 1 — несоответствие, как и окно больше экрана, на котором оно якобы находится. Инструменты автоматизации, подменяющие user agent, но забывающие про экран, оставляют именно такую нестыковку. В чек-листе согласованности отпечатка проверка экрана — одна из семи, а hardwareConcurrency и deviceMemory описывают другую пару значений, которую можно сверять на правдоподобие.
Ещё одна перекрёстная проверка — геометрия отрисовки. Размеры элементов страницы, измеренные скриптом, зависят от масштаба, как объясняет фингерпринтинг ClientRects, так что заявленный коэффициент, расходящийся с измеренной геометрией, — ещё одно место, где легенда может развалиться.
Защита: округление по корзинам
Цель защиты — большая толпа, а не случайная подделка.
- Letterboxing в Tor Browser. Анонс Tor Browser 9.0 описывает окно содержимого, округлённое до кратного 200×100 пикселей, так что пользователи попадают в несколько корзин. Letterboxing справляется с изменением размера и разворачиванием окна: добавляет белые поля, чтобы окно оставалось близко к желаемому размеру, но всё равно попадало в корзину.
- Firefox resist-fingerprinting.
privacy.resistFingerprintingзаимствует ту же идею округления. Что он меняет и что ломает — в статье resist fingerprinting: как это работает.
Цена очевидна: поля вокруг страницы и слегка неточная вёрстка.
Что на самом деле делает BrowserInsight
Без прикрас: проверка отпечатка показывает ширину на высоту, коэффициент пикселей, глубину цвета и доступную область ровно так, как их сообщает браузер. Страница обнаружения ботов выполняет проверку правдоподобия screen_size в разумном диапазоне (ширина от 320 до 7680, высота от 480 до 4320). Если user agent заявляет мобильное устройство, её проверка инструментов разработчика также сравнивает размер внешнего окна с размером экрана: большой разрыв здесь типичен для эмуляции устройства в DevTools. Сверх этого она не сверяет значения экрана с вашим user agent или GPU. Весь сбор данных идёт в вашем браузере, на сервер ничего не отправляется.
Частые вопросы
Уникально ли моё разрешение экрана? Само по себе — редко. Распространённые размеры есть у многих. Идентифицирующим оно становится только в сочетании с другими сигналами.
Почему availHeight отличается от height?
ОС резервирует место под интерфейс вроде панели задач или Dock, а availHeight его исключает.
Меняет ли зум браузера размер экрана?
Зум гарантированно меняет devicePixelRatio и размер области просмотра в CSS-пикселях. Меняется ли вместе с ним сообщаемый размер экрана, зависит от браузера, так что не считайте screen.width независимым от зума.
Скрывает ли VPN разрешение экрана? Нет. VPN меняет сетевой адрес, а не то, что браузер сообщает о своём дисплее.
Заключение
Размер экрана, доступная область и коэффициент пикселей — небольшие пассивные сигналы: разрешение не нужно, а к любому отпечатку они добавляют несколько бит. Их главная роль — проверка правдоподобия устройства, за которое выдаёт себя браузер. Посмотрите, что сообщает ваш браузер, в проверке отпечатка, и прочитайте руководство по фингерпринтингу браузера, чтобы увидеть полную картину.

