מערכת זיהוי הבוטים של TRACIO מזהה דפדפנים אוטומטיים, כלים headless ומתקפות מבוססות-סקריפט באמצעות ארכיטקטורה דו-שכבתית: איסוף אותות בצד הלקוח וניתוח בצד השרת. היא מזהה מסגרות אוטומציה נפוצות, דפדפני headless, סוכני גלישה מבוססי AI ודפדפני antidetect עם כמעט אפס תוצאות חיוביות שגויות, ובמקביל מוסיפה אוטומטית סורקי מנועי חיפוש לגיטימיים לרשימת ההיתר.
סוכן הדפדפן אוסף מגוון אותות ספציפיים לבוטים ואותות אימות-צולב (cross-validation) המזינים את ההחלטות בצד השרת. מזהי האותות שלהלן הם להמחשה בלבד — המזהים הפנימיים אינם חוזה ציבורי יציב:
| אות | תיאור |
|---|---|
s300 (webdriver) | הדגל navigator.webdriver — מוגדר ל-true על ידי מסגרות אוטומציה |
s301 (eval length) | eval.toString().length — Chrome/Edge: 33, Firefox: 37. ערכים אחרים מצביעים על אינסטרומנטציה. |
s305 (bot composite) | סורק את window/document עבור 14 ארטיפקטים של מסגרות אוטומציה |
s97 (headless markers) | ארטיפקטים של CDP, הרשאות התראות, מספר תוספים, מידות חיצוניות |
s157 (automation scan) | סריקה מקיפה עבור Selenium, Puppeteer, PhantomJS, Playwright ועוד 10 |
s158 (iframe webdriver) | יוצר iframe מוסתר וקורא בתוכו את navigator.webdriver. תופס כלים שמתקנים (patch) את המסגרת הראשית אך שוכחים את ה-iframes. |
s159 (native function) | מוחק את Function ואת Object, ובודק אם ה-getters אכן נייטיביים. מזהה אינסטרומנטציה מבוססת Proxy. |
s155 (window CRC32) | סריקת גיבוב CRC32 של כל מאפיין window לזיהוי גלובלים של אוטומציה שהוזרקו |
s163 (devtools trap) | מלכודת getter של ה-console — מזהה מתי ה-DevTools פתוחים באופן פעיל |
השרת מריץ מערך של גלאים שהפלטים המשוקללים שלהם מתלכדים לכדי ציון בוט (bot
score). הציון ממופה לפסק דין באמצעות ספי החלטה — bot כאשר הוא ≥ 0.70,
suspicious כאשר ≥ 0.30, אחרת human — ואות hard-fail (כגון
navigator.webdriver) כופה מיד פסק דין bot. פסקי דין של בוט נושאים תווית
bot_type בפורמט חופשי.
גלאים מייצגים והשפעתם:
| גלאי | השפעה |
|---|---|
| דגל Webdriver | Hard-fail → bot (מסוג webdriver) |
| סריקת אוטומציה/מסגרת מורכבת | משקל גבוה → bot (מסוג {framework}) |
| סמני headless | משוקלל → bot (מסוג headless) |
| חריגת eval-length | משוקלל → bot (מסוג unknown) |
| תבנית UA של בוט זדוני | משוקלל → bot (מסוג {label}) |
| בוט טוב מאומת (reverse DNS) | רשימת היתר → human |
| התנהגותי (קצב / אנטרופיה / אינטראקציה) | משוקלל → bot (מסוג rateBot) |
| VM (Enterprise) · אמולטור · DevTools (Business+) | אותות מכשיר/חבלה משוקללים |
תוכנית וזמינות. זיהוי DevTools פועל ב-Business וב-Enterprise; זיהוי VM הוא ב-Enterprise; זיהוי אמולטור פועל בכל התוכניות. כל אלה עובדים בסוכן הווב. זיהוי Root, jailbreak, אפליקציות משוכפלות/כפולות, Frida ואיפוס להגדרות יצרן תלוי באותות מובייל נייטיביים ואינו יעיל בפריסת ווב-בלבד (בפיתוח). הסתמכו על פסקי הדין של אוטומציה, headless, סוכני AI, antidetect, VM/אמולטור והתנהגות, הפעילים במלואם בווב.
זיהוי הבוטים כותב שדה bot_result בכל אירוע (ו-bot.result ב-payload
של ה-webhook).
bot_result הוא אחד משלושה ערכים קנוניים:
| תוצאה | תיאור |
|---|---|
human | לא נמצאו אינדיקטורים של אוטומציה. גם סורקי מנועי חיפוש מאומתים מתמפים ל-human. |
bot | זוהתה גישה אוטומטית או מבוססת-סקריפט. תווית bot_type בפורמט חופשי מלווה אותה. |
uncertain | אותות מעורבים או חלשים — לא אנושי בבירור ולא אוטומטי בבירור. |
זה ממופה לשדה העסקי decision (real, fake או suspicious)
המשמש בכל לוח הבקרה, ול-bot.result ב-
payload של ה-webhook.
"bot")bot_type הוא מחרוזת בפורמט חופשי. הערכים שלהלן הם דוגמאות להמחשה של
מה שהגלאים פולטים, ולא enum ממצה:
| סוג | שיטת זיהוי |
|---|---|
webdriver | navigator.webdriver הוא true |
selenium | זוהו מאפייני window/document ספציפיים ל-Selenium |
puppeteer | הותאמו אינדיקטורים של Puppeteer/Chromium headless |
playwright | זוהו סמנים ספציפיים ל-Playwright או מחרוזת UA |
headless | 2+ מתוך 11 סמני headless הופעלו |
phantomjs | זוהו גלובלים של PhantomJS (callPhantom, _phantom) |
nightmare | זוהו גלובלים של NightmareJS |
unknown | חריגת eval length או אינדיקטורים לא-ספציפיים אחרים של אוטומציה |
rateBot | ניתוח קצב התנהגותי חרג מהספים |
הזיהוי הישיר ביותר. כל מסגרות האוטומציה המרכזיות מגדירות navigator.webdriver = true בהתאם למפרט WebDriver. הדבר נבדק הן במסגרת הראשית (s300) והן ב-iframe מוסתר (s158) כדי לתפוס כלים שמתקנים (patch) רק את המסגרת הראשית.
סריקה מקיפה של מאפייני window ו-document עבור ארטיפקטים ספציפיים למסגרות:
| מסגרת | מאפיינים שזוהו |
|---|---|
| Selenium | _Selenium_IDE_Recorder, _selenium, calledSelenium, __selenium_evaluate, $cdc_* (ChromeDriver) |
| Puppeteer | domAutomation, domAutomationController, HeadlessChrome UA |
| Playwright | __playwright, דגל automation-controlled |
| PhantomJS | callPhantom, _phantom |
| NightmareJS | __nightmare, nightmare |
| CefSharp | CefSharp |
| Awesomium | awesomium |
| WebDriverIO | wdioElectron |
| Cypress | מאפיין window מסוג __cypress |
הסריקה משתמשת גם בתבנית regex /^([a-z]){3}_.*_(Array|Promise|Symbol)$/ לזיהוי גלובלי העזר שהוזרקו על ידי Selenium.
11 סמנים מוערכים, עם סף של 2 או יותר לצורך סיווג:
| סמן | אות | תנאי |
|---|---|---|
| webdriver | s300 | = "true" |
| אובייקטי ספק חסרים | s28 | אין אובייקטי chrome/safari על window |
| CDP headless chrome | s305 | headlessChrome = true |
| notification denied | s88 | Notification.permission = "denied" בביקור הראשון |
| chrome ללא runtime | s89 | window.chrome קיים אך chrome.runtime חסר |
| שפה יחידה | s90 | navigator.languages.length <= 1 |
| מסך ברירת מחדל 800x600 | s5 | רזולוציית ברירת המחדל של Headless Chrome |
| HeadlessChrome UA | UA | ה-User-Agent מכיל "HeadlessChrome" |
| מידות חיצוניות אפס | s97 | outerWidth = 0 ו-outerHeight = 0 |
| WebGL SwiftShader | s70 | ה-Renderer מכיל "swiftshader" (GPU תוכנתי) |
| WebGL llvmpipe | s70 | ה-Renderer מכיל "llvmpipe" (GPU תוכנתי) |
בוטים טובים ידועים מזוהים לפי תבנית User-Agent. כל אחד מאומת באמצעות reverse DNS כדי למנוע זיוף:
.googlebot.com)| בוט | דומיינים מורשים |
|---|---|
.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 אך ה-reverse DNS של ה-IP שלה מתפענח לדומיין זר (אי-התאמת PTR מאושרת, ולא רק חיפוש חסר/שפג בזמן), היא מסווגת כ-bot (מסוג spoofed:google).
זיהוי מבוסס-קצב עם ניקוד אנטרופיה:
| קצב (req/min) | סף אנטרופיה | פעולה |
|---|---|---|
| 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 תוכנן עבור כמעט אפס תוצאות חיוביות שגויות. עם זאת, מקרי קצה עשויים להתרחש:
| תרחיש | סיכון | הפחתה |
|---|---|---|
הרחבות דפדפן המשנות את navigator | נמוך | אימות-צולב של אותות מרובים מונע הפעלה מאות בודד |
| תוכנת אבטחה ארגונית | נמוך מאוד | זיהוי headless דורש 2+ סמנים |
| כלי נגישות | אין | ממשקי API של נגישות אינם מפעילים אותות זיהוי כלשהם |
| משתמשי VPN/proxy | אין | שימוש ב-VPN מנוטר בנפרד מזיהוי הבוטים |
אם אתם נתקלים בתוצאות חיוביות שגויות, בדקו את השדה bot.type כדי להבין איזה גלאי הופעל והתאימו את המדיניות שלכם בהתאם.