TRACIO का बॉट डिटेक्शन सिस्टम दो-परत वाली आर्किटेक्चर का उपयोग करके स्वचालित ब्राउज़र, हेडलेस टूल और स्क्रिप्टेड हमलों की पहचान करता है: क्लाइंट-साइड सिग्नल संग्रह और सर्वर-साइड विश्लेषण। यह मुख्यधारा के ऑटोमेशन फ़्रेमवर्क, हेडलेस ब्राउज़र, AI ब्राउज़िंग एजेंट और एंटीडिटेक्ट ब्राउज़र का लगभग शून्य फ़ॉल्स पॉज़िटिव के साथ पता लगाता है, और साथ ही वैध सर्च-इंजन क्रॉलर्स को स्वचालित रूप से allowlist में जोड़ता है।
ब्राउज़र एजेंट बॉट-विशिष्ट और क्रॉस-वैलिडेशन सिग्नलों की एक श्रृंखला एकत्र करता है जो सर्वर-साइड निर्णयों में शामिल होते हैं। नीचे दिए गए सिग्नल ID उदाहरणात्मक हैं — आंतरिक ID कोई स्थिर सार्वजनिक अनुबंध नहीं हैं:
| Signal | Description |
|---|---|
s300 (webdriver) | navigator.webdriver फ़्लैग — ऑटोमेशन फ़्रेमवर्क द्वारा true पर सेट किया जाता है |
s301 (eval length) | eval.toString().length — Chrome/Edge: 33, Firefox: 37. अन्य मान इंस्ट्रुमेंटेशन का संकेत देते हैं। |
s305 (bot composite) | 14 ऑटोमेशन फ़्रेमवर्क आर्टिफ़ैक्ट के लिए window/document को स्कैन करता है |
s97 (headless markers) | CDP आर्टिफ़ैक्ट, नोटिफ़िकेशन अनुमतियां, प्लगइन संख्या, बाहरी आयाम |
s157 (automation scan) | Selenium, Puppeteer, PhantomJS, Playwright और 10 अन्य के लिए व्यापक स्कैन |
s158 (iframe webdriver) | एक छिपा हुआ iframe बनाता है और उसके भीतर navigator.webdriver पढ़ता है। उन टूल को पकड़ता है जो मुख्य फ़्रेम को पैच करते हैं लेकिन iframe भूल जाते हैं। |
s159 (native function) | Function और Object को हटाता है, और परीक्षण करता है कि getter वास्तव में नेटिव हैं या नहीं। Proxy-आधारित इंस्ट्रुमेंटेशन का पता लगाता है। |
s155 (window CRC32) | इंजेक्ट किए गए ऑटोमेशन ग्लोबल्स का पता लगाने के लिए हर window प्रॉपर्टी का CRC32 हैश स्कैन |
s163 (devtools trap) | Console getter ट्रैप — पता लगाता है कि DevTools सक्रिय रूप से खुले हैं |
सर्वर डिटेक्टरों का एक सेट चलाता है जिनके भारित आउटपुट मिलकर एक बॉट
स्कोर बनाते हैं। स्कोर थ्रेशोल्ड के माध्यम से एक फ़ैसले से मैप होता है — bot जब यह ≥ 0.70 हो,
suspicious जब ≥ 0.30 हो, अन्यथा human — और एक हार्ड-फ़ेल सिग्नल (जैसे
navigator.webdriver) सीधे bot फ़ैसला मजबूर कर देता है। बॉट फ़ैसलों के साथ एक
मुक्त-रूप bot_type लेबल होता है।
प्रतिनिधि डिटेक्टर और उनका प्रभाव:
| Detector | Effect |
|---|---|
| Webdriver flag | Hard-fail → bot (type webdriver) |
| Composite automation / framework scan | High weight → bot (type {framework}) |
| Headless markers | Weighted → bot (type headless) |
| Eval-length anomaly | Weighted → bot (type unknown) |
| Bad-bot UA pattern | Weighted → bot (type {label}) |
| Verified good bot (reverse DNS) | Allowlist → human |
| Behavioral (rate / entropy / interaction) | Weighted → bot (type rateBot) |
| VM (Enterprise) · Emulator · DevTools (Business+) | Weighted device/tamper signals |
टियर और उपलब्धता। DevTools डिटेक्शन Business और Enterprise पर चलता है; VM डिटेक्शन Enterprise है; एमुलेटर डिटेक्शन सभी प्लान पर चलता है। ये सभी वेब एजेंट में काम करते हैं। Root, jailbreak, cloned/dual-app, Frida और factory-reset डिटेक्शन नेटिव-मोबाइल सिग्नलों पर निर्भर करते हैं और वेब-केवल परिनियोजन में प्रभावी नहीं हैं (विकासाधीन)। ऑटोमेशन, हेडलेस, AI-एजेंट, एंटीडिटेक्ट, VM/एमुलेटर और व्यवहारिक फ़ैसलों पर भरोसा करें, जो वेब पर पूरी तरह सक्रिय हैं।
बॉट डिटेक्शन हर इवेंट पर एक bot_result फ़ील्ड लिखता है (और webhook
payload में bot.result)।
bot_result तीन कैनोनिकल मानों में से एक होता है:
| Result | Description |
|---|---|
human | कोई ऑटोमेशन संकेतक नहीं मिला। सत्यापित सर्च-इंजन क्रॉलर भी human में हल होते हैं। |
bot | ऑटोमेशन या स्क्रिप्टेड एक्सेस का पता चला। इसके साथ एक मुक्त-रूप bot_type लेबल होता है। |
uncertain | मिश्रित या कमज़ोर सिग्नल — न स्पष्ट रूप से मानव और न स्पष्ट रूप से स्वचालित। |
यह डैशबोर्ड में उपयोग किए जाने वाले व्यावसायिक decision फ़ील्ड (real, fake या suspicious)
से मैप होता है, और
webhook payload में bot.result से।
"bot" हो)bot_type एक मुक्त-रूप स्ट्रिंग है। नीचे दिए गए मान इस बात के उदाहरणात्मक उदाहरण हैं कि
डिटेक्टर क्या उत्सर्जित करते हैं, कोई संपूर्ण enum नहीं:
| Type | Detection Method |
|---|---|
webdriver | navigator.webdriver true है |
selenium | Selenium-विशिष्ट window/document प्रॉपर्टी का पता चला |
puppeteer | Puppeteer/Chromium हेडलेस संकेतक मिले |
playwright | Playwright-विशिष्ट मार्कर या UA स्ट्रिंग का पता चला |
headless | 11 में से 2+ हेडलेस मार्कर ट्रिगर हुए |
phantomjs | PhantomJS ग्लोबल्स का पता चला (callPhantom, _phantom) |
nightmare | NightmareJS ग्लोबल्स का पता चला |
unknown | Eval length विसंगति या अन्य गैर-विशिष्ट ऑटोमेशन संकेतक |
rateBot | व्यवहारिक दर विश्लेषण ने थ्रेशोल्ड पार किए |
सबसे प्रत्यक्ष डिटेक्शन। सभी प्रमुख ऑटोमेशन फ़्रेमवर्क WebDriver विनिर्देश के अनुसार navigator.webdriver = true सेट करते हैं। इसे मुख्य फ़्रेम (s300) और एक छिपे हुए iframe (s158) दोनों में जांचा जाता है, ताकि उन टूल को पकड़ा जा सके जो केवल मुख्य फ़्रेम को पैच करते हैं।
फ़्रेमवर्क-विशिष्ट आर्टिफ़ैक्ट के लिए window और document प्रॉपर्टी की व्यापक स्कैनिंग:
| Framework | Properties Detected |
|---|---|
| Selenium | _Selenium_IDE_Recorder, _selenium, calledSelenium, __selenium_evaluate, $cdc_* (ChromeDriver) |
| Puppeteer | domAutomation, domAutomationController, HeadlessChrome UA |
| Playwright | __playwright, automation-controlled flag |
| PhantomJS | callPhantom, _phantom |
| NightmareJS | __nightmare, nightmare |
| CefSharp | CefSharp |
| Awesomium | awesomium |
| WebDriverIO | wdioElectron |
| Cypress | __cypress window property |
स्कैन Selenium के इंजेक्ट किए गए हेल्पर ग्लोबल्स का पता लगाने के लिए एक regex पैटर्न /^([a-z]){3}_.*_(Array|Promise|Symbol)$/ का भी उपयोग करता है।
11 मार्कर का मूल्यांकन किया जाता है, वर्गीकरण के लिए 2 या अधिक की थ्रेशोल्ड के साथ:
| Marker | Signal | Condition |
|---|---|---|
| webdriver | s300 | = "true" |
| missing vendor flavors | s28 | window पर कोई chrome/safari ऑब्जेक्ट नहीं |
| CDP headless chrome | s305 | headlessChrome = true |
| notification denied | s88 | पहली विज़िट पर Notification.permission = "denied" |
| chrome no runtime | s89 | window.chrome मौजूद है पर chrome.runtime अनुपस्थित है |
| single language | s90 | navigator.languages.length <= 1 |
| default screen 800x600 | s5 | हेडलेस Chrome डिफ़ॉल्ट रिज़ॉल्यूशन |
| HeadlessChrome UA | UA | User-Agent में "HeadlessChrome" शामिल है |
| zero outer dimensions | s97 | outerWidth = 0 और outerHeight = 0 |
| WebGL SwiftShader | s70 | Renderer में "swiftshader" शामिल है (सॉफ़्टवेयर GPU) |
| WebGL llvmpipe | s70 | Renderer में "llvmpipe" शामिल है (सॉफ़्टवेयर GPU) |
ज्ञात गुड बॉट को User-Agent पैटर्न से पहचाना जाता है। स्पूफ़िंग रोकने के लिए प्रत्येक को रिवर्स DNS के माध्यम से सत्यापित किया जाता है:
.googlebot.com) से जांच| Bot | Allowed Domains |
|---|---|
.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 |
यदि कोई अनुरोध Googlebot होने का दावा करता है लेकिन उसके IP का रिवर्स DNS किसी विदेशी डोमेन में हल होता है (एक पुष्ट PTR बेमेल, न कि केवल अनुपस्थित/टाइम-आउट लुकअप), तो इसे bot (type spoofed:google) के रूप में वर्गीकृत किया जाता है।
एन्ट्रॉपी स्कोरिंग के साथ दर-आधारित डिटेक्शन:
| Rate (req/min) | Entropy Threshold | Action |
|---|---|---|
| 120+ | < 0.1 | bot (type: rateBot) |
| 60-120 | < 0.3 | bot (type: rateBot) |
| 45-60 | < 0.1 | bot (type: rateBot) |
| < 45 | Any | Normal |
अतिरिक्त नियम: 30+ सेकंड की सत्र आयु के बाद कोई माउस/कीबोर्ड इवेंट न होना विज़िट को noInteraction प्रकार के साथ bot के रूप में वर्गीकृत करता है।
eval.toString().length प्रति इंजन सुसंगत मान उत्पन्न करता है:
कोई अन्य मान संकेत देता है कि eval फ़ंक्शन को किसी ऑटोमेशन फ़्रेमवर्क द्वारा हुक किया गया है, जो विज़िट को unknown प्रकार के साथ bot के रूप में वर्गीकृत करता है।
क्लाइंट SDK एक सुविधाजनक बूलियन प्रदान करता है, 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)अपने सर्वर पर, webhook डिलीवरी पर कार्य करें। बॉट डिटेक्शन
bot ऑब्जेक्ट में रहता है — bot.result और 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 का बॉट डिटेक्शन लगभग शून्य फ़ॉल्स पॉज़िटिव के लिए डिज़ाइन किया गया है। हालांकि, किनारे के मामले हो सकते हैं:
| Scenario | Risk | Mitigation |
|---|---|---|
navigator को संशोधित करने वाले ब्राउज़र एक्सटेंशन | Low | एकाधिक सिग्नल क्रॉस-वैलिडेशन एकल-सिग्नल ट्रिगर को रोकता है |
| कॉर्पोरेट सुरक्षा सॉफ़्टवेयर | Very Low | हेडलेस डिटेक्शन के लिए 2+ मार्कर आवश्यक हैं |
| एक्सेसिबिलिटी टूल | None | एक्सेसिबिलिटी API कोई डिटेक्शन सिग्नल ट्रिगर नहीं करते |
| VPN/प्रॉक्सी उपयोगकर्ता | None | VPN उपयोग को बॉट डिटेक्शन से अलग ट्रैक किया जाता है |
यदि आपको फ़ॉल्स पॉज़िटिव मिलते हैं, तो यह समझने के लिए bot.type फ़ील्ड की समीक्षा करें कि कौन सा डिटेक्टर ट्रिगर हुआ था और अपनी नीति को तदनुसार समायोजित करें।