TRACIO:s system för botdetektering identifierar automatiserade webbläsare, headless-verktyg och skriptbaserade attacker med hjälp av en tvålagersarkitektur: klientsidig signalinsamling och serversidig analys. Det upptäcker gängse automatiseringsramverk, headless-webbläsare, AI-webbläsaragenter och antidetect-webbläsare med nära noll falska positiva, och sätter samtidigt automatiskt legitima sökmotor-crawlers på allowlistan.
Webbläsaragenten samlar in en rad botspecifika och korsvaliderande signaler som matas in i serversidans beslut. Signal-ID:na nedan är illustrativa — de interna ID:na är inte något stabilt offentligt kontrakt:
| Signal | Beskrivning |
|---|---|
s300 (webdriver) | navigator.webdriver-flaggan — satt till true av automatiseringsramverk |
s301 (eval length) | eval.toString().length — Chrome/Edge: 33, Firefox: 37. Andra värden tyder på instrumentering. |
s305 (bot composite) | Genomsöker window/document efter 14 automatiseringsramverk-artefakter |
s97 (headless markers) | CDP-artefakter, notifieringsbehörigheter, antal plugins, yttermått |
s157 (automation scan) | Omfattande genomsökning efter Selenium, Puppeteer, PhantomJS, Playwright och 10 till |
s158 (iframe webdriver) | Skapar en dold iframe och läser navigator.webdriver inuti den. Fångar verktyg som patchar huvudramen men glömmer iframes. |
s159 (native function) | Raderar Function och Object och testar om getters är verkligt nativa. Upptäcker Proxy-baserad instrumentering. |
s155 (window CRC32) | CRC32-hashgenomsökning av varje window-egenskap för att upptäcka injicerade automatiserings-globals |
s163 (devtools trap) | Console-getter-fälla — upptäcker när DevTools är aktivt öppna |
Servern kör en uppsättning detektorer vars viktade utdata kombineras till ett
bot-score. Poängen mappas till ett verdikt via tröskelvärden — bot när det är ≥ 0,70,
suspicious när ≥ 0,30, annars human — och en hard-fail-signal (såsom
navigator.webdriver) framtvingar direkt ett bot-verdikt. Bot-verdikt bär en
fri bot_type-etikett.
Representativa detektorer och deras effekt:
| Detektor | Effekt |
|---|---|
| Webdriver-flagga | Hard-fail → bot (typ webdriver) |
| Composite-automatiserings-/ramverksgenomsökning | Hög vikt → bot (typ {framework}) |
| Headless-markörer | Viktad → bot (typ headless) |
| Eval-length-anomali | Viktad → bot (typ unknown) |
| Bad-bot-UA-mönster | Viktad → bot (typ {label}) |
| Verifierad bra bot (reverse DNS) | Allowlist → human |
| Beteendebaserad (rate / entropi / interaktion) | Viktad → bot (typ rateBot) |
| VM (Enterprise) · Emulator · DevTools (Business+) | Viktade enhets-/manipuleringssignaler |
Nivå & tillgänglighet. DevTools-detektering körs på Business och Enterprise; VM-detektering är Enterprise; emulatordetektering körs på alla planer. Allt detta fungerar i webbagenten. Detektering av root, jailbreak, klonade/dubbla appar, Frida och fabriksåterställning beror på nativa mobilsignaler och är inte effektiv i den rena webbdriftsättningen (under utveckling). Förlita dig på verdikten för automatisering, headless, AI-agent, antidetect, VM/emulator och beteende, som är fullt aktiva på webben.
Botdetektering skriver ett bot_result-fält på varje event (och bot.result i
webhook-payloaden).
bot_result är ett av tre kanoniska värden:
| Resultat | Beskrivning |
|---|---|
human | Inga automatiseringsindikatorer hittades. Verifierade sökmotor-crawlers ger också human. |
bot | Automatiserad eller skriptbaserad åtkomst upptäckt. En fri bot_type-etikett åtföljer det. |
uncertain | Blandade eller svaga signaler — varken tydligt mänskligt eller tydligt automatiserat. |
Detta mappas till det affärsmässiga decision-fältet (real, fake eller suspicious)
som används genom hela dashboarden, och till bot.result i
webhook-payloaden.
"bot")bot_type är en fri sträng. Värdena nedan är illustrativa exempel på
vad detektorerna avger, inte en uttömmande enum:
| Typ | Detekteringsmetod |
|---|---|
webdriver | navigator.webdriver är true |
selenium | Selenium-specifika window/document-egenskaper upptäckta |
puppeteer | Puppeteer-/Chromium-headless-indikatorer matchade |
playwright | Playwright-specifika markörer eller UA-sträng upptäckt |
headless | 2+ av 11 headless-markörer utlösta |
phantomjs | PhantomJS-globals upptäckta (callPhantom, _phantom) |
nightmare | NightmareJS-globals upptäckta |
unknown | Eval-length-anomali eller andra ospecifika automatiseringsindikatorer |
rateBot | Beteendebaserad rate-analys överskred tröskelvärden |
Den mest direkta detekteringen. Alla större automatiseringsramverk sätter navigator.webdriver = true enligt WebDriver-specifikationen. Detta kontrolleras både i huvudramen (s300) och i en dold iframe (s158) för att fånga verktyg som endast patchar huvudramen.
Omfattande genomsökning av window- och document-egenskaper efter ramverksspecifika artefakter:
| Framework | Upptäckta egenskaper |
|---|---|
| Selenium | _Selenium_IDE_Recorder, _selenium, calledSelenium, __selenium_evaluate, $cdc_* (ChromeDriver) |
| Puppeteer | domAutomation, domAutomationController, HeadlessChrome-UA |
| Playwright | __playwright, automation-controlled-flagga |
| PhantomJS | callPhantom, _phantom |
| NightmareJS | __nightmare, nightmare |
| CefSharp | CefSharp |
| Awesomium | awesomium |
| WebDriverIO | wdioElectron |
| Cypress | __cypress-window-egenskap |
Genomsökningen använder även ett regex-mönster /^([a-z]){3}_.*_(Array|Promise|Symbol)$/ för att upptäcka Seleniums injicerade hjälp-globals.
11 markörer utvärderas, med ett tröskelvärde på 2 eller fler för klassificering:
| Markör | Signal | Villkor |
|---|---|---|
| webdriver | s300 | = "true" |
| saknade vendor-flavors | s28 | Inga chrome/safari-objekt på window |
| CDP headless chrome | s305 | headlessChrome = true |
| notification denied | s88 | Notification.permission = "denied" vid första besöket |
| chrome no runtime | s89 | window.chrome finns men chrome.runtime saknas |
| single language | s90 | navigator.languages.length <= 1 |
| default screen 800x600 | s5 | Standardupplösning för headless Chrome |
| HeadlessChrome UA | UA | User-Agent innehåller "HeadlessChrome" |
| zero outer dimensions | s97 | outerWidth = 0 och outerHeight = 0 |
| WebGL SwiftShader | s70 | Renderer innehåller "swiftshader" (mjukvaru-GPU) |
| WebGL llvmpipe | s70 | Renderer innehåller "llvmpipe" (mjukvaru-GPU) |
Kända bra botar känns igen via User-Agent-mönster. Varje verifieras via reverse DNS för att förhindra spoofing:
.googlebot.com)| Bot | Tillåtna domäner |
|---|---|
.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 |
Om en förfrågan påstår sig vara Googlebot men dess IP:s reverse DNS löses upp till en främmande domän (en bekräftad PTR-avvikelse, inte enbart ett saknat/utgånget uppslag), klassificeras den som bot (typ spoofed:google).
Rate-baserad detektering med entropi-scoring:
| Rate (req/min) | Entropitröskel | Åtgärd |
|---|---|---|
| 120+ | < 0.1 | bot (typ: rateBot) |
| 60-120 | < 0.3 | bot (typ: rateBot) |
| 45-60 | < 0.1 | bot (typ: rateBot) |
| < 45 | Valfri | Normal |
Ytterligare regel: Inga mus-/tangentbordshändelser efter 30+ sekunders sessionslängd klassificerar besöket som bot med typ noInteraction.
eval.toString().length producerar konsekventa värden per engine:
Vilket som helst annat värde tyder på att eval-funktionen har hookats av ett automatiseringsramverk, vilket klassificerar besöket som bot med typ unknown.
Klient-SDK:t exponerar en praktisk 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)På din server, agera på webhook-leveransen. Botdetekteringen
finns i bot-objektet — bot.result och 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")})TRACIO:s botdetektering är utformad för nära noll falska positiva. Gränsfall kan dock förekomma:
| Scenario | Risk | Motåtgärd |
|---|---|---|
Webbläsartillägg som ändrar navigator | Låg | Korsvalidering av flera signaler förhindrar utlösning av en enskild signal |
| Företagssäkerhetsprogramvara | Mycket låg | Headless-detektering kräver 2+ markörer |
| Tillgänglighetsverktyg | Ingen | Tillgänglighets-API:er utlöser inga detekteringssignaler |
| VPN-/proxyanvändare | Ingen | VPN-användning spåras separat från botdetektering |
Om du stöter på falska positiva, granska bot.type-fältet för att förstå vilken detektor som utlöstes och justera din policy därefter.