يحدِّد نظام كشف البوتات في TRACIO المتصفحات الآلية والأدوات التي تعمل بلا واجهة (headless) والهجمات المكتوبة برمجيًا باستخدام بنية من طبقتين: جمع الإشارات من جهة العميل والتحليل من جهة الخادم. يكتشف النظام أطر الأتمتة الشائعة والمتصفحات التي تعمل بلا واجهة ووكلاء التصفح بالذكاء الاصطناعي ومتصفحات مقاومة البصمة مع نسبة إيجابيات خاطئة شبه معدومة، مع إدراج زواحف محركات البحث المشروعة تلقائيًا في قائمة السماح.
يجمع وكيل المتصفح مجموعة من الإشارات الخاصة بالبوتات وإشارات التحقق المتقاطع التي تغذّي القرارات على جهة الخادم. معرّفات الإشارات أدناه توضيحية — فالمعرّفات الداخلية ليست عقدًا عامًا ثابتًا:
| Signal | الوصف |
|---|---|
s300 (webdriver) | العلَم navigator.webdriver — تضبطه أطر الأتمتة على true |
s301 (eval length) | eval.toString().length — Chrome/Edge: 33، Firefox: 37. القيم الأخرى تدل على وجود أدوات قياس (instrumentation). |
s305 (bot composite) | يفحص window/document بحثًا عن 14 أثرًا من آثار أطر الأتمتة |
s97 (headless markers) | آثار CDP، وأذونات الإشعارات، وعدد الإضافات، والأبعاد الخارجية |
s157 (automation scan) | فحص شامل لـ Selenium وPuppeteer وPhantomJS وPlaywright و10 أخرى |
s158 (iframe webdriver) | ينشئ iframe مخفيًا ويقرأ navigator.webdriver بداخله. يلتقط الأدوات التي ترقّع الإطار الرئيسي لكنها تنسى إطارات iframe. |
s159 (native function) | يحذف Function وObject، ويختبر ما إذا كانت الجوالب (getters) أصلية فعلًا. يكشف أدوات القياس المعتمدة على Proxy. |
s155 (window CRC32) | فحص تجزئة CRC32 لكل خاصية من خصائص window لاكتشاف متغيّرات الأتمتة العامة المحقونة |
s163 (devtools trap) | فخّ الجالب في وحدة التحكم (Console) — يكشف متى تكون أدوات المطوّر (DevTools) مفتوحة فعليًا |
يشغّل الخادم مجموعة من الكواشف التي تُدمج مخرجاتها الموزونة في درجة بوت
(bot score). تُربَط الدرجة بحكم عبر عتبات — bot عندما تكون ≥ 0.70،
وsuspicious عندما تكون ≥ 0.30، وإلا فـ human — وتفرض إشارة الفشل الحاد (مثل
navigator.webdriver) حكم bot مباشرةً. تحمل أحكام البوت
تسمية bot_type حرة الصياغة.
كواشف تمثيلية وتأثيرها:
| Detector | التأثير |
|---|---|
| Webdriver flag | فشل حاد → bot (النوع webdriver) |
| Composite automation / framework scan | وزن عالٍ → bot (النوع {framework}) |
| Headless markers | موزون → bot (النوع headless) |
| Eval-length anomaly | موزون → bot (النوع unknown) |
| Bad-bot UA pattern | موزون → bot (النوع {label}) |
| Verified good bot (reverse DNS) | قائمة سماح → human |
| Behavioral (rate / entropy / interaction) | موزون → bot (النوع rateBot) |
| VM (Enterprise) · Emulator · DevTools (Business+) | إشارات جهاز/عبث موزونة |
الفئة والتوافر. يعمل كشف DevTools على خطتَي Business وEnterprise؛ وكشف الأجهزة الافتراضية (VM) حصري لـ Enterprise؛ ويعمل كشف المحاكيات على جميع الخطط. كل هذا يعمل في وكيل الويب. أما كشف الجذر (root) وكسر الحماية (jailbreak) والتطبيقات المستنسخة/المزدوجة وFrida وإعادة ضبط المصنع فيعتمد على إشارات الأجهزة المحمولة الأصلية، وهو غير فعّال في النشر المقتصر على الويب (قيد التطوير). اعتمد على أحكام الأتمتة والعمل بلا واجهة ووكلاء الذكاء الاصطناعي ومقاومة البصمة والأجهزة الافتراضية/المحاكيات والسلوك، وهي مفعَّلة بالكامل على الويب.
يكتب كشف البوتات حقل bot_result في كل حدث (وbot.result في
الحمولة الخاصة بالـ webhook).
bot_result هي إحدى ثلاث قيم قياسية:
| Result | الوصف |
|---|---|
human | لم يُعثر على مؤشرات أتمتة. تُصنَّف زواحف محركات البحث الموثَّقة أيضًا على أنها human. |
bot | تم اكتشاف وصول آلي أو مكتوب برمجيًا. تصاحبه تسمية bot_type حرة الصياغة. |
uncertain | إشارات مختلطة أو ضعيفة — لا هي بشرية بوضوح ولا آلية بوضوح. |
يُربَط هذا بحقل القرار التجاري decision (real أو fake أو suspicious)
المستخدَم عبر لوحة التحكم، وبـ bot.result في
حمولة الـ webhook.
"bot")bot_type سلسلة نصية حرة الصياغة. القيم أدناه أمثلة توضيحية على
ما تصدره الكواشف، وليست تعدادًا شاملًا:
| Type | طريقة الكشف |
|---|---|
webdriver | navigator.webdriver تساوي true |
selenium | اكتُشفت خصائص window/document خاصة بـ Selenium |
puppeteer | تطابقت مؤشرات Puppeteer/Chromium العاملة بلا واجهة |
playwright | اكتُشفت علامات خاصة بـ Playwright أو سلسلة وكيل المستخدم |
headless | تم تفعيل مؤشرَين أو أكثر من أصل 11 مؤشرًا للعمل بلا واجهة |
phantomjs | اكتُشفت متغيّرات PhantomJS العامة (callPhantom و_phantom) |
nightmare | اكتُشفت متغيّرات NightmareJS العامة |
unknown | شذوذ في طول eval أو مؤشرات أتمتة أخرى غير محددة |
rateBot | تجاوز تحليل المعدل السلوكي العتبات |
الكشف الأكثر مباشرة. تضبط جميع أطر الأتمتة الرئيسية navigator.webdriver = true وفقًا لمواصفة WebDriver. يُفحص هذا في الإطار الرئيسي (s300) وفي iframe مخفي (s158) لالتقاط الأدوات التي ترقّع الإطار الرئيسي فقط.
فحص شامل لخصائص window وdocument بحثًا عن آثار خاصة بالأطر:
| Framework | الخصائص المكتشفة |
|---|---|
| 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 |
يستخدم الفحص أيضًا النمط النظامي /^([a-z]){3}_.*_(Array|Promise|Symbol)$/ لاكتشاف متغيّرات Selenium المساعدة العامة المحقونة.
يجري تقييم 11 مؤشرًا، بعتبة اثنين أو أكثر للتصنيف:
| Marker | Signal | الشرط |
|---|---|---|
| webdriver | s300 | = "true" |
| missing vendor flavors | s28 | لا توجد كائنات chrome/safari على window |
| 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 | دقة العرض الافتراضية لـ Headless Chrome |
| HeadlessChrome UA | UA | وكيل المستخدم يحتوي على "HeadlessChrome" |
| zero outer dimensions | s97 | outerWidth = 0 وouterHeight = 0 |
| WebGL SwiftShader | s70 | العارِض يحتوي على "swiftshader" (معالج رسوميات برمجي) |
| WebGL llvmpipe | s70 | العارِض يحتوي على "llvmpipe" (معالج رسوميات برمجي) |
تُعرَف البوتات الجيدة المعروفة عبر نمط وكيل المستخدم. ويُتحقَّق من كل منها عبر DNS العكسي لمنع التزييف:
.googlebot.com)| Bot | النطاقات المسموح بها |
|---|---|
.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 لكن DNS العكسي لعنوان IP الخاص به يُحلَّل إلى نطاق أجنبي (عدم تطابق PTR مؤكَّد، وليس مجرد بحث مفقود/انتهت مهلته)، فإنه يُصنَّف على أنه bot (النوع spoofed:google).
كشف قائم على المعدل مع تسجيل للإنتروبيا:
| Rate (req/min) | Entropy Threshold | الإجراء |
|---|---|---|
| 120+ | < 0.1 | bot (النوع: rateBot) |
| 60-120 | < 0.3 | bot (النوع: rateBot) |
| 45-60 | < 0.1 | bot (النوع: rateBot) |
| < 45 | أي قيمة | عادي |
قاعدة إضافية: عدم وجود أحداث فأرة/لوحة مفاتيح بعد مرور 30 ثانية أو أكثر على عمر الجلسة يصنّف الزيارة على أنها bot بالنوع noInteraction.
يُنتج eval.toString().length قيمًا ثابتة لكل محرك:
أي قيمة أخرى تدل على أن دالة eval قد جرى اعتراضها (hooked) من قبل إطار أتمتة، ما يصنّف الزيارة على أنها bot بالنوع unknown.
يوفّر الـ 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 | الخطر | التخفيف |
|---|---|---|
إضافات المتصفح التي تعدّل navigator | منخفض | التحقق المتقاطع لعدة إشارات يمنع التفعيل بإشارة واحدة |
| برمجيات الأمان المؤسسية | منخفض جدًا | يتطلّب كشف العمل بلا واجهة مؤشرَين أو أكثر |
| أدوات إمكانية الوصول | لا يوجد | واجهات إمكانية الوصول (Accessibility APIs) لا تفعّل أي إشارة كشف |
| مستخدمو VPN/الوكيل | لا يوجد | يُتتبَّع استخدام VPN بشكل منفصل عن كشف البوتات |
إذا واجهت إيجابيات خاطئة، فراجع حقل bot.type لفهم أي كاشف جرى تفعيله واضبط سياستك وفقًا لذلك.