TRACIO'nun bot algılama sistemi, iki katmanlı bir mimari kullanarak otomatikleştirilmiş tarayıcıları, headless araçları ve betiğe dayalı saldırıları belirler: istemci tarafı sinyal toplama ve sunucu tarafı analiz. Yaygın otomasyon framework'lerini, headless tarayıcıları, yapay zeka gezinme aracılarını ve antidetect tarayıcıları neredeyse sıfır yanlış pozitifle algılarken, meşru arama motoru tarayıcılarını (crawler) otomatik olarak allowlist'e ekler.
Tarayıcı aracısı, sunucu tarafı kararlara beslenen bir dizi bota özgü ve çapraz doğrulama sinyali toplar. Aşağıdaki sinyal ID'leri açıklayıcı niteliktedir — dahili ID'ler kararlı bir genel (public) sözleşme değildir:
| Sinyal | Açıklama |
|---|---|
s300 (webdriver) | navigator.webdriver bayrağı — otomasyon framework'leri tarafından true olarak ayarlanır |
s301 (eval length) | eval.toString().length — Chrome/Edge: 33, Firefox: 37. Diğer değerler enstrümantasyona işaret eder. |
s305 (bot composite) | window/document içinde 14 otomasyon framework'ü artefaktını tarar |
s97 (headless markers) | CDP artefaktları, bildirim izinleri, eklenti sayısı, dış boyutlar |
s157 (automation scan) | Selenium, Puppeteer, PhantomJS, Playwright ve 10 tanesi daha için kapsamlı tarama |
s158 (iframe webdriver) | Gizli bir iframe oluşturur ve içinde navigator.webdriver okur. Ana frame'i yamalayan ama iframe'leri unutan araçları yakalar. |
s159 (native function) | Function ve Object'i siler, getter'ların gerçekten native olup olmadığını test eder. Proxy tabanlı enstrümantasyonu algılar. |
s155 (window CRC32) | Enjekte edilmiş otomasyon global'lerini algılamak için her window özelliğinin CRC32 hash taraması |
s163 (devtools trap) | Console getter tuzağı — DevTools'un aktif olarak açık olduğunu algılar |
Sunucu, ağırlıklı çıktıları bir bot skoruna birleşen bir dizi dedektör
çalıştırır. Skor, eşikler aracılığıyla bir verdikte eşlenir — ≥ 0,70 olduğunda
bot, ≥ 0,30 olduğunda suspicious, aksi halde human — ve bir hard-fail
sinyali (örneğin navigator.webdriver) doğrudan bir bot verdikti zorunlu
kılar. Bot verdiktleri serbest biçimli bir bot_type etiketi taşır.
Temsili dedektörler ve etkileri:
| Dedektör | Etki |
|---|---|
| Webdriver bayrağı | Hard-fail → bot (tip webdriver) |
| Composite otomasyon / framework taraması | Yüksek ağırlık → bot (tip {framework}) |
| Headless işaretçileri | Ağırlıklı → bot (tip headless) |
| Eval-length anomalisi | Ağırlıklı → bot (tip unknown) |
| Bad-bot UA deseni | Ağırlıklı → bot (tip {label}) |
| Doğrulanmış iyi bot (ters DNS) | Allowlist → human |
| Davranışsal (oran / entropi / etkileşim) | Ağırlıklı → bot (tip rateBot) |
| VM (Enterprise) · Emulator · DevTools (Business+) | Ağırlıklı cihaz/tamper sinyalleri |
Katman ve kullanılabilirlik. DevTools algılaması Business ve Enterprise'da çalışır; VM algılaması Enterprise'dır; emülatör algılaması tüm planlarda çalışır. Bunların hepsi web aracısında çalışır. Root, jailbreak, klonlanmış/çift uygulama, Frida ve fabrika ayarlarına sıfırlama algılaması native mobil sinyallere bağlıdır ve yalnızca web dağıtımında etkili değildir (geliştirme aşamasında). Web'de tamamen aktif olan otomasyon, headless, yapay zeka aracısı, antidetect, VM/emülatör ve davranışsal verdiktlere güvenin.
Bot algılama, her olaya bir bot_result alanı yazar (ve webhook
payload'ında bot.result).
bot_result, üç kanonik değerden biridir:
| Sonuç | Açıklama |
|---|---|
human | Otomasyon göstergesi bulunamadı. Doğrulanmış arama motoru tarayıcıları da human olarak çözümlenir. |
bot | Otomasyon veya betiğe dayalı erişim algılandı. Yanına serbest biçimli bir bot_type etiketi eşlik eder. |
uncertain | Karışık veya zayıf sinyaller — ne net biçimde insan ne de net biçimde otomatik. |
Bu, gösterge panosunun genelinde kullanılan iş decision alanına (real,
fake veya suspicious) ve webhook payload'ındaki
bot.result'a eşlenir.
"bot" olduğunda)bot_type serbest biçimli bir string'dir. Aşağıdaki değerler, dedektörlerin
ürettiklerinin açıklayıcı örnekleridir, kapsamlı bir enum değildir:
| Tür | Algılama Yöntemi |
|---|---|
webdriver | navigator.webdriver değeri true |
selenium | Selenium'a özgü window/document özellikleri algılandı |
puppeteer | Puppeteer/Chromium headless göstergeleri eşleşti |
playwright | Playwright'a özgü işaretçiler veya UA string algılandı |
headless | 11 headless işaretçisinden 2+'si tetiklendi |
phantomjs | PhantomJS global'leri algılandı (callPhantom, _phantom) |
nightmare | NightmareJS global'leri algılandı |
unknown | Eval length anomalisi veya diğer spesifik olmayan otomasyon göstergeleri |
rateBot | Davranışsal oran analizi eşikleri aştı |
En doğrudan algılama. Tüm başlıca otomasyon framework'leri, WebDriver spesifikasyonu uyarınca navigator.webdriver = true ayarlar. Bu, yalnızca ana frame'i yamalayan araçları yakalamak için hem ana frame'de (s300) hem de gizli bir iframe'de (s158) kontrol edilir.
window ve document özelliklerinin framework'e özgü artefaktlar için kapsamlı taraması:
| Framework | Algılanan Özellikler |
|---|---|
| Selenium | _Selenium_IDE_Recorder, _selenium, calledSelenium, __selenium_evaluate, $cdc_* (ChromeDriver) |
| Puppeteer | domAutomation, domAutomationController, HeadlessChrome UA |
| Playwright | __playwright, automation-controlled bayrağı |
| PhantomJS | callPhantom, _phantom |
| NightmareJS | __nightmare, nightmare |
| CefSharp | CefSharp |
| Awesomium | awesomium |
| WebDriverIO | wdioElectron |
| Cypress | __cypress window özelliği |
Tarama ayrıca, Selenium'un enjekte ettiği yardımcı global'leri algılamak için /^([a-z]){3}_.*_(Array|Promise|Symbol)$/ regex desenini kullanır.
11 işaretçi değerlendirilir; sınıflandırma için eşik 2 veya daha fazladır:
| İşaretçi | Sinyal | Koşul |
|---|---|---|
| webdriver | s300 | = "true" |
| eksik vendor flavor'lar | s28 | window'da chrome/safari nesnesi yok |
| CDP headless chrome | s305 | headlessChrome = true |
| notification denied | s88 | İlk ziyarette Notification.permission = "denied" |
| chrome no runtime | s89 | window.chrome var ama chrome.runtime eksik |
| tek dil | s90 | navigator.languages.length <= 1 |
| varsayılan ekran 800x600 | s5 | Headless Chrome varsayılan çözünürlüğü |
| HeadlessChrome UA | UA | User-Agent "HeadlessChrome" içeriyor |
| sıfır dış boyutlar | s97 | outerWidth = 0 ve outerHeight = 0 |
| WebGL SwiftShader | s70 | Renderer "swiftshader" içeriyor (yazılım GPU) |
| WebGL llvmpipe | s70 | Renderer "llvmpipe" içeriyor (yazılım GPU) |
Bilinen iyi botlar User-Agent deseniyle tanınır. Her biri, spoofing'i önlemek için ters DNS ile doğrulanır:
.googlebot.com)| Bot | İzin Verilen Domain'ler |
|---|---|
.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 |
Bir istek Googlebot olduğunu iddia ederse ancak IP'sinin ters DNS'i yabancı bir domain'e çözümlenirse (eksik/zaman aşımına uğramış bir arama değil, doğrulanmış bir PTR uyumsuzluğu), bot (tip spoofed:google) olarak sınıflandırılır.
Entropi puanlamalı orana dayalı algılama:
| Oran (istek/dk) | Entropi Eşiği | Eylem |
|---|---|---|
| 120+ | < 0.1 | bot (tip: rateBot) |
| 60-120 | < 0.3 | bot (tip: rateBot) |
| 45-60 | < 0.1 | bot (tip: rateBot) |
| < 45 | Herhangi | Normal |
Ek kural: Oturum yaşı 30+ saniye olduktan sonra hiçbir fare/klavye olayı olmaması, ziyareti noInteraction tipiyle bot olarak sınıflandırır.
eval.toString().length, motor başına tutarlı değerler üretir:
Başka herhangi bir değer, eval fonksiyonunun bir otomasyon framework'ü tarafından hook'landığına işaret eder ve ziyareti unknown tipiyle bot olarak sınıflandırır.
İstemci SDK'sı, pratik bir boolean sunar, 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)Sunucunuzda, webhook teslimatına göre hareket edin. Bot algılama
bot nesnesinde bulunur — bot.result ve 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'nun bot algılaması neredeyse sıfır yanlış pozitif için tasarlanmıştır. Yine de sınır durumları oluşabilir:
| Senaryo | Risk | Önlem |
|---|---|---|
navigator'ı değiştiren tarayıcı uzantıları | Düşük | Çoklu sinyal çapraz doğrulaması tek sinyalli tetiklenmeyi önler |
| Kurumsal güvenlik yazılımı | Çok düşük | Headless algılama 2+ işaretçi gerektirir |
| Erişilebilirlik araçları | Yok | Erişilebilirlik API'leri herhangi bir algılama sinyali tetiklemez |
| VPN/proxy kullanıcıları | Yok | VPN kullanımı bot algılamadan ayrı olarak izlenir |
Yanlış pozitiflerle karşılaşırsanız, hangi dedektörün tetiklendiğini anlamak için bot.type alanını inceleyin ve politikanızı buna göre ayarlayın.