BotDetect v2 — مكتبة كشف البوتات للبيئات الإنتاجية
مكتبة كشف البوتات والأتمتة من جانب العميل مع نظام تسجيل مرجح، وتحليل سلوكي، وبصمة متصفح، وعتبات قابلة للتكوين. تكتشف المتصفحات عديمة الرأس، وسيلينيوم، وبابيتير، وبلاي رايت، والأدوات القائمة على بروتوكول CDP، وأطر الأتمتة الخفية.
الإصدار v2.1.0 — مصائد مضادة للاكتشاف، بصمة كانفاس مستقرة لبطاقة الرسوميات GPU، تحليل سلوكي محسّن، تهيئة كسولة، كشف التلاعب من جانب الخادم، ربط بصمة الطلب، وتحديد معدل الطلبات.
جدول المحتويات
الميزات
- 28 وحدة كشف تغطي أطر الأتمتة، والمتصفحات عديمة الرأس، والبصمة، والتحليل السلوكي، والمصائد، ومصائد تتبع مكدس الاستدعاءات
- نظام تسجيل مرجح — لكل إشارة وزن قابل للتكوين؛ النتيجة النهائية تُحسب من جانب الخادم
- ثلاثة مستويات حكم:
human (بشري)، suspicious (مريب)، bot (بوت) مع إجراءات احتكاك مقابلة (monitor مراقبة، challenge تحدٍ، block حظر)
- التحقق من جانب الخادم — مقيد بـ nonce، محمي من إعادة التشغيل، موقع بإثبات العمل
- مصائد تتبع مكدس الاستدعاءات — تزييد واجهات برمجة تطبيقات DOM لالتقاط مكدسات استدعاء أدوات الأتمتة
- التحليل السلوكي — انحناء الماوس، تباين توقيت ضغطات المفاتيح، تسارع التمرير، ديناميكيات اللمس
- مصائد مضادة للاكتشاف — إخفاء عشوائي عبر CSS، حقول خادعة، أسماء حقول واقعية
- كشف التلاعب من جانب الخادم — يتحقق من سلامة الإشارة، ويكشف محاولات التلاعب
- ربط بصمة الطلب — ربط رموز إثبات العمل بخصائص طلب HTTP
- تحديد معدل الطلبات — تحديد المعدل لكل جلسة على جميع نقاط التحقق
- كشف عدم وجود سكريبت — يحدد العملاء الذين لا يرسلون حمولات الكشف مطلقًا
- قائمة مسموح بها للزواحف المعروفة — أكثر من 20 بوتًا شرعيًا مستبعدًا من التسجيل
الهندسة المعمارية
Browser Your Server
┌──────────────────────────┐ ┌──────────────────────┐
│ Collector (singleton) │ POST │ Express Middleware │
│ ├─ 28 detection modules│ signals │ ├─ NonceManager │
│ ├─ BehaviorTracker │ + nonce │ ├─ RateLimiter │
│ ├─ HoneypotTraps │───────────▶│ ├─ TamperDetector │
│ ├─ Stack trace traps │ │ ├─ computeVerdict() │
│ └─ IframeContext │ │ └─ Proof-of-Work │
│ │ verdict │ │
│ ↓ collect() → │ + proof │ Returns: │
│ DetectionResult[] │◀───────────│ { verdict, score, │
└──────────────────────────┘ │ confidence, proof, │
│ tamperScore } │
└──────────────────────┘
│
▼
Session-gated endpoint
(login, checkout, etc.)
validates proof before
granting access
المبدأ الأساسي: يقوم المتصفح فقط بجمع إشارات DetectionResult[] الأولية. الخادم يحسب الحكم النهائي باستخدام جدول أوزان سري. لا يتم الوثوق أبدًا بالنتائج المحسوبة من جانب العميل.
البدء السريع
1. البناء
npm install
npm run build
المخرجات إلى dist/:
botdetect.min.js (مع polyfills، حوالي 151 كيلوبايت)
botdetect-clean.min.js (للمتصفحات الحديثة فقط، حوالي 74 كيلوبايت)
2. تضمينه في صفحتك
<script src="/path/to/botdetect.min.js"></script>
<script>
BotDetect.collector.enableTraps();
BotDetect.collector.enableBehavioralTracking();
BotDetect.collector.enableHoneypots();
</script>
3. إعداد التحقق من جانب الخادم
cd server
npm install express cors express-session
node example-integration.js
4. إرسال الإشارات عند إجراء حساس
async function onLogin() {
const { nonce } = await (await fetch('/api/botdetect/nonce')).json();
BotDetect.collector.setNonce(nonce);
const signals = await BotDetect.collector.collect();
const resp = await fetch('/api/botdetect/verify', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ signals, nonce })
});
const { verdict, score, proof, friction } = await resp.json();
document.getElementById('botdetect-proof').value = proof;
document.getElementById('login-form').submit();
}
5. التحقق على الخادم
app.post('/api/login', (req, res) => {
const bd = req.session.botdetect;
if (!bd) return res.status(403).json({ error: 'no_verification' });
if (bd.verdict === 'bot') return res.status(403).json({ error: 'access_denied' });
if (bd.verdict === 'suspicious') return challengeCaptcha(req, res);
res.json({ success: true });
});
واجهة برمجة التطبيقات من جانب العميل
Collector (مفرد)
import Collector from './collector/Collector';
// أو عبر الكائن العام: BotDetect.collector
Detector (للتصحيح فقط)
import Detector from './detector/Detector';
تحذير: يتم تشغيل analyze() بالكامل في المتصفح. لا تستخدم مخرجاته أبدًا في قرارات الإنتاج.
الأنواع
interface DetectionResult {
name: string; // اسم الوحدة
score: number; // 0.0 – 1.0
weight: number; // 1 – 10 (الأهمية)
detail?: string; // وصف قابل للقراءة البشرية
}
interface DetectionVerdict {
verdict: 'bot' | 'suspicious' | 'human';
score: number; // 0.0 – 1.0
confidence: number; // 0.0 – 1.0
signals: DetectionResult[];
threshold: number;
friction: 'monitor' | 'challenge' | 'block';
}
interface CollectorConfig {
detectionTimeoutMs: number; // مهلة لكل وحدة (الافتراضي: 3000)
enableTraps: boolean;
enableBehavioralTracking: boolean;
enableHoneypots: boolean;
thresholds: { strict: number; balanced: number; relaxed: number };
}
التكامل من جانب الخادم
الوسيط Express
const { createBotDetectEndpoint } = require('./server');
const { router, generateProofOfWork, cleanup } = createBotDetectEndpoint({
secretSalt: process.env.BOTDETECT_SALT,
scoring: {
threshold: 'balanced', // 'strict' | 'balanced' | 'relaxed' | number
minSignals: 2,
signalBoostThreshold: 0.8,
frictionThresholds: { monitor: 0.2, challenge: 0.5, block: 0.8 }
},
nonce: { ttl: 300000 }, // صلاحية nonce لمدة 5 دقائق
noScript: { timeout: 10000 }, // نافذة عدم وجود سكريبت 10 ثوانٍ
rateLimit: { maxRequests: 10, windowMs: 60000 },
noScriptPaths: ['/api/login', '/api/checkout', '/api/register']
});
app.use('/api', router);
نقاط النهاية
| نقطة النهاية | الطريقة | الغرض |
|---|
/api/botdetect/nonce | GET |
تنسيق استجابة الخادم
{
"verdict": "human",
"score": 0.125,
"confidence": 0.85,
"tamperScore": 0,
"friction": "monitor",
"threshold": 0.5,
"proof": "a1b2c3d4e5f6..."
}
التسجيل من جانب الخادم (Node.js)
const { computeVerdict, RateLimiter, NonceManager } = require('./scoring');
const verdict = computeVerdict(signals, {
threshold: 'balanced',
minSignals: 2,
signalBoostThreshold: 0.8,
frictionThresholds: { monitor: 0.2, challenge: 0.5, block: 0.8 }
});
// verdict.tamperScore > 0 إذا تم الكشف عن تلاعب بالإشارة
وحدات الكشف
أطر الأتمتة (الأوزان 5–7)
خاصة بـ Playwright (الأوزان 3–4)
| الوحدة | تكتشف | الوزن |
|---|
playwrightWebKit | أثر أتمتة WebKit | 4 |
playwrightOrientation | عدم تناسق الاتجاه مع chrome.runtime | 3 |
التحليل السلوكي (الوزن 7)
| الوحدة | الإشارات المحللة | الوزن |
|---|
behavioralAnalysis | انحناء الماوس + نسبة الخط المستقيم، تباين ضغطات المفاتيح + أنماط الاندفاع + KPM، تسارع التمرير + تغيرات الاتجاه، تباين قوة اللمس + نصف القطر | 7 |
بصمة المتصفح (الأوزان 3–4)
خصائص Navigator و نظام التشغيل (الوزن 5)
| الوحدة | الفحوصات | الوزن |
|---|
navigatorInconsistencies | 11 فحصًا: languages، plugins، mimeTypes، platform، UA، cookies، DNT، touch، hardwareConcurrency، deviceMemory، connection | 5 |
الشاشة و الأداء (الوزن 3)
المصائد النشطة و المصائد الخادعة (الأوزان 8–9)
| الوحدة | تكتشف | الوزن |
|---|
honeypotTraps | حقول مخفية عشوائية + حقول خادعة + نقطة نهاية كناري | 9 |
|
الشبكة و السياق (الأوزان 1–2)
القائمة المسموح بها (الوزن 0)
| الوحدة | تكتشف | الوزن |
|---|
verifiedBots | أكثر من 20 زاحفًا معروفًا (Googlebot، Bingbot، Yandex، Facebook، Twitter، إلخ) — يُرجع -1، مستبعد من التسجيل | 0 |
التكوين
Collector
const collector = Collector.getInstance({
detectionTimeoutMs: 1000, // أقل لتجربة مستخدم أسرع
enableTraps: true,
enableBehavioralTracking: true,
enableHoneypots: true,
thresholds: {
strict: 0.3, // عدواني (تسجيل الدخول، الدفع)
balanced: 0.5, // افتراضي
relaxed: 0.7 // متساهل (تصفح المحتوى)
}
});
Detector (للتصحيح فقط)
const detector = Detector.getInstance({
threshold: 'balanced', // 'strict' | 'balanced' | 'relaxed' | number
minSignals: 2, // الحد الأدنى من الإشارات قبل التعزيز
signalBoostThreshold: 0.8, // الإشارات فوق هذا تحصل على وزن إضافي
failPolicy: 'open', // 'open' = بشري عند الخطأ، 'closed' = بوت عند الخطأ
frictionThresholds: {
monitor: 0.2,
challenge: 0.5,
block: 0.8
}
});
الخادم
createBotDetectEndpoint({
secretSalt: process.env.BOTDETECT_SALT, // حافظ على السرية
scoring: { threshold: 'balanced' },
nonce: { ttl: 300000, cleanupInterval: 60000 },
noScript: { timeout: 10000 },
rateLimit: { maxRequests: 10, windowMs: 60000 },
requestFingerprint: true, // ربط PoW بخصائص الطلب
noScriptPaths: ['/api/login', '/api/checkout']
});
قائمة التحقق للإنتاج
الأمان
الأداء
المراقبة
الاختبار
npm test # 74 اختبار Jest عبر 6 مجموعات
npm run typecheck # وضع TypeScript الصارم
npm run lint # ESLint
npm run build # حزمة Webpack للإنتاج
الترخيص
Apache — Lahmeri Mohamed Amine