Systém detekce botů TRACIO identifikuje automatizované prohlížeče, headless nástroje a skriptované útoky pomocí dvouvrstvé architektury: sběr signálů na straně klienta a analýza na straně serveru. Detekuje běžné automatizační frameworky, headless prohlížeče, AI agenty pro procházení webu a antidetekční prohlížeče s téměř nulovou mírou falešně pozitivních výsledků a zároveň automaticky přidává legitimní crawlery vyhledávačů na allowlist.
Agent prohlížeče sbírá řadu signálů specifických pro boty a signálů pro křížovou validaci, které vstupují do rozhodování na straně serveru. Níže uvedená ID signálů jsou ilustrativní — interní ID nejsou stabilním veřejným kontraktem:
| Signál | Popis |
|---|---|
s300 (webdriver) | Příznak navigator.webdriver — automatizačními frameworky nastaven na true |
s301 (eval length) | eval.toString().length — Chrome/Edge: 33, Firefox: 37. Jiné hodnoty naznačují instrumentaci. |
s305 (bot composite) | Prohledává window/document na 14 artefaktů automatizačních frameworků |
s97 (headless markers) | Artefakty CDP, oprávnění k notifikacím, počet pluginů, vnější rozměry |
s157 (automation scan) | Komplexní sken na Selenium, Puppeteer, PhantomJS, Playwright a 10 dalších |
s158 (iframe webdriver) | Vytvoří skrytý iframe a přečte v něm navigator.webdriver. Odhalí nástroje, které opraví hlavní rámec, ale zapomenou na iframy. |
s159 (native function) | Odstraní Function a Object a otestuje, zda jsou gettery skutečně nativní. Detekuje instrumentaci založenou na Proxy. |
s155 (window CRC32) | Sken CRC32 hashe každé vlastnosti window k odhalení injektovaných automatizačních globálů |
s163 (devtools trap) | Past na getteru konzole — detekuje, kdy jsou DevTools aktivně otevřené |
Server spouští sadu detektorů, jejichž vážené výstupy se kombinují do bot
skóre. Skóre se přes prahové hodnoty mapuje na verdikt — bot, když je ≥ 0,70,
suspicious, když je ≥ 0,30, jinak human — a hard-fail signál (například
navigator.webdriver) vynutí verdikt bot napřímo. Verdikty typu bot nesou
volný štítek bot_type.
Reprezentativní detektory a jejich efekt:
| Detektor | Efekt |
|---|---|
| Příznak webdriver | Hard-fail → bot (typ webdriver) |
| Kompozitní automatizační / framework sken | Vysoká váha → bot (typ {framework}) |
| Headless markery | Vážené → bot (typ headless) |
| Anomálie délky eval | Vážené → bot (typ unknown) |
| Vzor UA špatného bota | Vážené → bot (typ {label}) |
| Ověřený dobrý bot (reverzní DNS) | Allowlist → human |
| Behaviorální (rychlost / entropie / interakce) | Vážené → bot (typ rateBot) |
| VM (Enterprise) · Emulátor · DevTools (Business+) | Vážené signály zařízení/manipulace |
Tarif a dostupnost. Detekce DevTools běží na tarifech Business a Enterprise; detekce VM je pouze Enterprise; detekce emulátoru běží na všech tarifech. To vše funguje ve webovém agentovi. Detekce rootu, jailbreaku, klonovaných/duálních aplikací, Fridy a továrního resetu závisí na nativních mobilních signálech a v čistě webovém nasazení není účinná (ve vývoji). Spoléhejte na verdikty ohledně automatizace, headless, AI agentů, antidetekce, VM/emulátoru a chování, které jsou na webu plně aktivní.
Detekce botů zapisuje pole bot_result ke každé události (a bot.result ve
webhookovém payloadu).
bot_result je jedna ze tří kanonických hodnot:
| Výsledek | Popis |
|---|---|
human | Nenalezeny žádné indikátory automatizace. Ověřené crawlery vyhledávačů také dají human. |
bot | Detekován automatizovaný nebo skriptovaný přístup. Doprovází jej volný štítek bot_type. |
uncertain | Smíšené nebo slabé signály — ani jednoznačně lidský, ani jednoznačně automatizovaný. |
To se mapuje na obchodní pole decision (real, fake nebo suspicious)
používané napříč dashboardem a na bot.result ve
webhookovém payloadu.
"bot")bot_type je volný řetězec. Níže uvedené hodnoty jsou ilustrativní příklady toho,
co detektory vydávají, nikoli vyčerpávající výčet:
| Typ | Metoda detekce |
|---|---|
webdriver | navigator.webdriver je true |
selenium | Detekovány vlastnosti window/document specifické pro Selenium |
puppeteer | Shoda s headless indikátory Puppeteer/Chromium |
playwright | Detekovány markery specifické pro Playwright nebo UA řetězec |
headless | Vyvoláno 2+ z 11 headless markerů |
phantomjs | Detekovány globály PhantomJS (callPhantom, _phantom) |
nightmare | Detekovány globály NightmareJS |
unknown | Anomálie délky eval nebo jiné nespecifické indikátory automatizace |
rateBot | Behaviorální analýza rychlosti překročila prahové hodnoty |
Nejpřímější detekce. Všechny hlavní automatizační frameworky nastavují navigator.webdriver = true podle specifikace WebDriver. Toto se kontroluje jak v hlavním rámci (s300), tak ve skrytém iframu (s158), aby se zachytily nástroje, které opraví pouze hlavní rámec.
Komplexní skenování vlastností window a document na artefakty specifické pro frameworky:
| Framework | Detekované vlastnosti |
|---|---|
| Selenium | _Selenium_IDE_Recorder, _selenium, calledSelenium, __selenium_evaluate, $cdc_* (ChromeDriver) |
| Puppeteer | domAutomation, domAutomationController, HeadlessChrome UA |
| Playwright | __playwright, příznak automation-controlled |
| PhantomJS | callPhantom, _phantom |
| NightmareJS | __nightmare, nightmare |
| CefSharp | CefSharp |
| Awesomium | awesomium |
| WebDriverIO | wdioElectron |
| Cypress | vlastnost __cypress na window |
Sken také používá regulární výraz /^([a-z]){3}_.*_(Array|Promise|Symbol)$/ k detekci pomocných globálů injektovaných Seleniem.
Vyhodnocuje se 11 markerů s prahem 2 a více pro klasifikaci:
| Marker | Signál | Podmínka |
|---|---|---|
| webdriver | s300 | = "true" |
| chybějící vendor příchutě | s28 | Žádné objekty chrome/safari na window |
| CDP headless chrome | s305 | headlessChrome = true |
| notification denied | s88 | Notification.permission = "denied" při první návštěvě |
| chrome no runtime | s89 | window.chrome existuje, ale chrome.runtime chybí |
| jediný jazyk | s90 | navigator.languages.length <= 1 |
| výchozí obrazovka 800x600 | s5 | Výchozí rozlišení headless Chrome |
| HeadlessChrome UA | UA | User-Agent obsahuje "HeadlessChrome" |
| nulové vnější rozměry | s97 | outerWidth = 0 a outerHeight = 0 |
| WebGL SwiftShader | s70 | Renderer obsahuje "swiftshader" (softwarové GPU) |
| WebGL llvmpipe | s70 | Renderer obsahuje "llvmpipe" (softwarové GPU) |
Známé dobré boty se rozpoznávají podle vzoru User-Agent. Každý je ověřen přes reverzní DNS, aby se zabránilo spoofingu:
.googlebot.com)| Bot | Povolené domény |
|---|---|
.googlebot.com, .google.com | |
| Bing | .search.msn.com |
| Apple | .applebot.apple.com |
| Yahoo | .crawl.yahoo.net |
| Yandex | .yandex.com, .yandex.net, .yandex.ru |
| DuckDuckGo | .duckduckgo.com |
Pokud požadavek tvrdí, že je Googlebot, ale reverzní DNS jeho IP se rozliší na cizí doménu (potvrzený nesoulad PTR, nikoli pouze chybějící/vypršelý lookup), je klasifikován jako bot (typ spoofed:google).
Detekce založená na rychlosti s hodnocením entropie:
| Rychlost (req/min) | Práh entropie | Akce |
|---|---|---|
| 120+ | < 0.1 | bot (typ: rateBot) |
| 60-120 | < 0.3 | bot (typ: rateBot) |
| 45-60 | < 0.1 | bot (typ: rateBot) |
| < 45 | Jakýkoli | Normální |
Doplňující pravidlo: Žádné události myši/klávesnice po 30+ sekundách stáří relace klasifikují návštěvu jako bot s typem noInteraction.
eval.toString().length produkuje konzistentní hodnoty pro každý engine:
Jakákoli jiná hodnota naznačuje, že funkce eval byla zaháknuta automatizačním frameworkem, což klasifikuje návštěvu jako bot s typem unknown.
Klientské SDK vystavuje praktický boolean result.bot.detected:
const result = await tracio.getResult()
if (result.bot.detected) { // Log and block console.warn(`Bot detected (confidence ${result.bot.confidence})`) showCaptcha() return}
// Proceed with loginawait login(credentials)Na svém serveru reagujte na doručení webhooku. Detekce botů
se nachází v objektu bot — bot.result a bot.type:
// `event` is the webhook delivery body (/docs/webhooks)app.post("/webhook/tracio", async (req, res) => { const event = req.body
if (event.bot.result === "bot") { await db.blockedRequests.insert({ visitorId: event.visitorId, botType: event.bot.type, ip: event.ip, timestamp: new Date(), }) }
res.status(200).send("OK")})Detekce botů TRACIO je navržena pro téměř nulovou míru falešně pozitivních výsledků. Přesto se mohou vyskytnout hraniční případy:
| Scénář | Riziko | Zmírnění |
|---|---|---|
Rozšíření prohlížeče měnící navigator | Nízké | Vícenásobná křížová validace signálů brání spuštění jediným signálem |
| Podnikový bezpečnostní software | Velmi nízké | Detekce headless vyžaduje 2+ markery |
| Nástroje pro přístupnost | Žádné | API pro přístupnost nespouští žádné detekční signály |
| Uživatelé VPN/proxy | Žádné | Používání VPN se sleduje odděleně od detekce botů |
Pokud narazíte na falešně pozitivní výsledky, prohlédněte si pole bot.type, abyste pochopili, který detektor byl spuštěn, a upravte podle toho svou politiku.