Headless-detector — практичний набір сигналів для виявлення headless та automation у браузері
Мене звати Андрій, я працюю з веб-проєктами де є форми, реєстрації, флоу з високою ціною помилки (спам, фрод, накрутки, «прогрів» акаунтів). На словах все просто — «знайди бота і заблокуй». На практиці — ботів стало набагато більше через ШІ-революцію.
Через це мені захотілось мати інструмент, який:
- не робить магічне
bot: trueз одного прапорця - показує, чому ми вирішили що сесія підозріла
- дає більш-менш стабільний скоринг, який можна підкрутити під свою логіку
Так з’явився headless-detector — невелика JS-бібліотека для клієнтської діагностики automation/headless середовища.
Репозиторій: github.com/...vchenko/headless-detector
Демо: headless-detector.vercel.app
NPM: www.npmjs.com/...package/headless-detector
Що саме перевіряється
1) WebDriver та automation flags
Перевірки на зразок navigator.webdriver плюс типові глобальні змінні/ознаки, які лишають Selenium, Playwright, Puppeteer, PhantomJS та інші фреймворки.
2) CDP артефакти (Chrome DevTools Protocol)
В детекторі є перевірки на характерні сліди ChromeDriver/CDP.
3) Headless індикатори середовища
Наприклад, нетипові розміри вікна, поведінка outer/inner dimensions, деякі ньюанси з permissions.
4) WebGL renderer
5) Media/WebRTC та базові API
У headless режимі або в сильно обмежених профілях інколи відсутні mediaDevices, getUserMedia, або WebRTC працює не так як очікується. Важливо розуміти, що тут можуть бути false positives через приватність, корпоративні політики, sandboxing.
6) Fingerprinting-блок (canvas/audio/fonts)
Це не спроба «вирахувати користувача». Ідея простіша — знайти аномалії середовища, які часто корелюють з headless/automation або з агресивним spoofing’ом.
7) Системна інформація
- Battery API, Hardware concurrency, memory, etc
- Locale, Timezone
8) Audio Context fingerprinting
Headless-браузери можуть по-іншому обробляти аудіо
9) Font detection
Headless-браузери зазвичай мають менше трьох доступних шрифтів
10) Playwright Detection (Castle.io 2026)
Перевіряє відповідність відображення емодзі заявленій операційній системі
Найкорисніше — не score, а пояснення
Детектор повертає не тільки цифру, а ще два важливі поля:
explanations— короткий опис кожного методу: що він шукає, навіщо, і який у нього impactsummary— агрегований звіт: класифікація, risk level, список детекцій та попереджень, плюс рекомендація
Як це виглядає у коді
Найпростіший сценарій — підключити файл детектора і викликати detectHeadless():
// 1) Запустити детекцію
const result = detectHeadless(true); // true — щоб прикріпити результат до window для дебага
// 2) Числовий скор (0..1)
console.log("score:", result.isHeadless);
// 3) Пояснення
console.log(result.summary.classification);
console.log(result.summary.riskLevel);
console.log(result.summary.detections);
console.log(result.summary.warnings);
// 4) Детальні «що і навіщо»
console.log(result.explanations);
Обмеження (без цього було б нечесно)
- Деякі сигнали легко спуфяться
- Частина сигналів може спрацьовувати в легітимних користувачів (VM, privacy browsers, корпоративні політики, нестандартні профілі).
- Якщо атакуюча сторона має мотивацію, це завжди гра в Том і Джеррі

16 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів