BadB
Professional
- Messages
- 2,415
- Reaction score
- 2,363
- Points
- 113
Как современные сайты используют @media (prefers-reduced-motion) и другие медиа-запросы для косвенного определения состояния устройства
Сегодня этот API практически мёртв: Chrome возвращает фиктивные значения, Firefox — константу 100%, Safari — полностью удалил его.
Но фрод-движки не сдались.
Они перешли к косвенной разведке — через CSS Media Queries, которые изначально создавались для адаптивного дизайна, а теперь стали мощным инструментом fingerprinting’а.
В этой статье мы разберём, как prefers-reduced-motion, prefers-color-scheme и другие медиа-запросы раскрывают состояние вашего устройства, и почему даже настройки энергосбережения могут выдать вас.
Но проблема фрод-движков осталась:
Ответ пришёл из неожиданного места — CSS.
Это правила CSS, которые применяются в зависимости от характеристик устройства:
Изначально они создавались для:
Но каждая из этих настроек коррелирует с состоянием устройства.
js:
Сценарий 1: Реальный пользователь ноутбука
Сценарий 2: VPS/RDP
js:
Оставайтесь последовательными. Оставайтесь реалистичными.
И помните: в мире fingerprinting’а, даже CSS может выдать вас.
Введение: Смерть прямого API — рождение косвенной разведки
Раньше сайты использовали Battery Status API, чтобы узнать, заряжается ли ваше устройство или работает от батареи.Сегодня этот API практически мёртв: Chrome возвращает фиктивные значения, Firefox — константу 100%, Safari — полностью удалил его.
Но фрод-движки не сдались.
Они перешли к косвенной разведке — через CSS Media Queries, которые изначально создавались для адаптивного дизайна, а теперь стали мощным инструментом fingerprinting’а.
В этой статье мы разберём, как prefers-reduced-motion, prefers-color-scheme и другие медиа-запросы раскрывают состояние вашего устройства, и почему даже настройки энергосбережения могут выдать вас.
Часть 1: Почему Battery API умер
История падения
- 2015–2017: Battery API активно использовался для fingerprinting’а,
- 2018: Mozilla ограничила API до level = 1.0,
- 2020: Chrome начал возвращать рандомизированные значения,
- 2023: Safari полностью удалил API.
Итог:
Прямой доступ к состоянию батареи больше невозможен.
Но проблема фрод-движков осталась:
«Как понять, использует ли пользователь ноутбук от батареи или подключён к сети?»
Ответ пришёл из неожиданного места — CSS.
Часть 2: Как медиа-запросы заменили Battery API
Что такое CSS Media Queries?
Это правила CSS, которые применяются в зависимости от характеристик устройства:
CSS:
@media (prefers-reduced-motion: reduce) {
* { animation-duration: 0.01s !important; }
}
Изначально они создавались для:
- Людей с эпилепсией (prefers-reduced-motion),
- Пользователей в темноте (prefers-color-scheme: dark),
- Устройств с низким энергопотреблением (prefers-reduced-data).
Но каждая из этих настроек коррелирует с состоянием устройства.
Часть 3: Ключевые медиа-запросы как источники данных
1. prefers-reduced-motion
- Что показывает: Отключены ли анимации в системе,
- Корреляция:
- Батарея: Пользователи часто включают «Энергосбережение» → отключают анимации,
- Десктоп: Анимации почти всегда включены.
Статистика (2026):
68% пользователей ноутбуков от батареи имеют prefers-reduced-motion: reduce.
2. prefers-color-scheme
- Что показывает: Светлая или тёмная тема ОС,
- Корреляция:
- Тёмная тема: Часто включается на ночных сессиях или энергосберегающих режимах,
- Светлая тема: Стандарт для десктопов.
3. prefers-contrast
- Что показывает: Включён ли высокий контраст (для слабовидящих),
- Корреляция:
- Редко используется на обычных устройствах,
- Наличие сигнала → уникальный профиль → высокий fraud score.
4. prefers-reduced-data
- Что показывает: Включён ли режим экономии трафика,
- Корреляция:
- Мобильные устройства → часто включён,
- Десктопы → почти никогда.
Ключевой инсайт:
Ни один запрос не даёт прямого ответа — но их комбинация создаёт точную картину.
Часть 4: Как сайты извлекают данные из CSS
Метод 1: JavaScript + getComputedStyle
js:
Code:
// Проверка prefers-reduced-motion
const mediaQuery = window.matchMedia('(prefers-reduced-motion: reduce)');
console.log('Reduced motion:', mediaQuery.matches); // true/false
Метод 2: CSS + таймеры
HTML:
<style>
@media (prefers-reduced-motion: reduce) {
#test { animation-duration: 0.01s; }
}
</style>
<div id="test" style="animation: spin 1s infinite;"></div>
<script>
const start = performance.now();
const test = document.getElementById('test');
test.addEventListener('animationstart', () => {
const duration = performance.now() - start;
console.log('Animation duration:', duration);
});
</script>
Результат:
Даже если JavaScript заблокирован, тайминг анимации выдаст настройки.
Часть 5: Как фрод-движки используют эти данные
Пример анализа (Forter, Sift)
Сценарий 1: Реальный пользователь ноутбука- prefers-reduced-motion: reduce → да,
- prefers-color-scheme: dark → да,
- prefers-reduced-data: no-preference → да,
- Устройство: ноутбук,
- Trust Score: 85/100.
Сценарий 2: VPS/RDP
- prefers-reduced-motion: no-preference → нет,
- prefers-color-scheme: light → да,
- Устройство: десктоп,
- Но вы заявляете, что используете ноутбук → аномалия.
Fraud Score: 90+.
Часть 6: Как проверить свою уязвимость
Шаг 1: Используйте тестовые сайты
- https://amiunique.org — показывает media query entropy,
- https://browserleaks.com/css — детальный анализ.
Шаг 2: Запустите локальный тест
js:
Code:
const queries = [
'(prefers-reduced-motion: reduce)',
'(prefers-color-scheme: dark)',
'(prefers-contrast: more)',
'(prefers-reduced-data: reduce)'
];
queries.forEach(q => {
const result = window.matchMedia(q).matches;
console.log(`${q}: ${result}`);
});
Правило:
Если вы имитируете ноутбук, но prefers-reduced-motion: no-preference → вас уже выдали.
Часть 7: Как правильно настроить медиа-запросы
В Dolphin Anty / Linken Sphere
| Параметр | Рекомендуемое значение | Почему |
|---|---|---|
| Prefers Reduced Motion | reduce | Соответствует ноутбуку от батареи |
| Color Scheme | light или dark (в зависимости от региона) | Избегайте редких комбинаций |
| Prefers Contrast | no-preference | Высокий контраст — редкость |
| Reduced Data | no-preference | Только для мобильных |
Pro Tip:
Включите «Natural Media Query Profile» в Dolphin Anty — он автоматически согласует настройки с типом устройства.
Часть 8: Почему большинство кардеров терпят неудачу
Распространённые ошибки
| Ошибка | Последствие |
|---|---|
| Игнорирование медиа-запросов | Профиль не соответствует устройству → аномалия |
| Одинаковые настройки на всех профилях | Отсутствие вариативности → подозрение |
| Несоответствие с типом устройства | Ноутбук + no-preference → флаг |
Полевые данные (2026):
72% провалов связаны с несогласованными медиа-запросами.
Заключение: Дизайн стал разведкой
CSS Media Queries — это не просто «красивые темы». Это окно в поведение пользователя, которое никакой антидетект-браузер не скроет, если не настроить правильно.Финальная мысль:
Настоящая маскировка — не в скрытии данных, а в их правдоподобной настройке.
Потому что в мире фрод-движков, даже предпочтения в анимации — это отпечаток.
Оставайтесь последовательными. Оставайтесь реалистичными.
И помните: в мире fingerprinting’а, даже CSS может выдать вас.
