BotDetect v2 — Produktions-Bot-Erkennungsbibliothek
Clientseitige Bot- und Automatisierungserkennungsbibliothek mit gewichteter Bewertung, Verhaltensanalyse, Browser-Fingerprinting und konfigurierbaren Schwellenwerten. Erkennt Headless-Browser, Selenium, Puppeteer, Playwright, CDP-basierte Tools und Stealth-Automatisierungsframeworks.
v2.1.0 — Anti-Erkennungs-Honeypots, GPU-stabiles Canvas-Fingerprinting, verbesserte Verhaltensanalyse, träge Initialisierung, serverseitige Manipulationserkennung, Anforderungs-Fingerprint-Bindung und Ratenbegrenzung.
Inhaltsverzeichnis
Funktionen
- 28 Erkennungsmodule decken Automatisierungsframeworks, Headless-Browser, Fingerprinting, Verhaltensanalyse, Honeypots und Stack-Trace-Fallen ab.
- Gewichtetes Bewertungssystem — jedes Signal hat ein konfigurierbares Gewicht; endgültige Bewertung serverseitig berechnet.
- Drei Urteilsstufen:
human, suspicious, bot mit entsprechenden Reaktionsmaßnahmen (monitor, challenge, block)
- Serverseitige Überprüfung — Nonce-gesteuert, replay-geschützt, Proof-of-Work-signiert.
- Stack-Trace-Fallen — patcht DOM-APIs, um Aufrufstapel von Automatisierungswerkzeugen zu erfassen.
- Verhaltensanalyse — Mauskrümmung, Tastenanschlagsdauervarianz, Scrollbeschleunigung, Touch-Dynamik.
- Anti-Erkennungs-Honeypots — zufälliges CSS-Cloaking, Täuschungsfelder, realistische Feldnamen.
- Serverseitige Manipulationserkennung — prüft Signalintegrität, erkennt Manipulationsversuche.
- Anforderungs-Fingerprint-Bindung — PoW-Tokens an HTTP-Anforderungsattribute gebunden.
- Ratenbegrenzung — sitzungsbezogene Ratenbegrenzung auf allen Verifikationsendpunkten.
- No-Script-Erkennung — identifiziert Clients, die nie Erkennungspayloads senden.
- Bekannte Crawler-Whitelist — 20+ legitime Bots von der Bewertung ausgeschlossen.
Architektur
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
Schlüsselprinzip: Der Browser sammelt nur rohe DetectionResult[]-Signale. Der Server berechnet das endgültige Urteil mit einer geheimen Gewichtstabelle. Vom Client berechnete Urteile werden niemals vertraut.
Schnellstart
1. Erstellen
npm install
npm run build
Ausgabe in dist/:
botdetect.min.js (mit Polyfills, ~151 KB)
botdetect-clean.min.js (nur moderne Browser, ~74 KB)
2. Auf Ihrer Seite einbinden
<script src="/path/to/botdetect.min.js"></script>
<script>
BotDetect.collector.enableTraps();
BotDetect.collector.enableBehavioralTracking();
BotDetect.collector.enableHoneypots();
</script>
3. Serverseitige Verifikation einrichten
cd server
npm install express cors express-session
node example-integration.js
4. Signale bei sensiblen Aktionen senden
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. Auf dem Server validieren
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 });
});
Clientseitige API
Collector (Singleton)
import Collector from './collector/Collector';
// or via global: BotDetect.collector
Detektor (nur Debug)
import Detector from './detector/Detector';
Warnung: analyze() läuft vollständig im Browser. Verwenden Sie seine Ausgabe niemals für Produktionsentscheidungen.
Typen
interface DetectionResult {
name: string; // Modulname
score: number; // 0.0 – 1.0
weight: number; // 1 – 10 (Wichtigkeit)
detail?: string; // Menschenlesbare Beschreibung
}
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; // Zeitüberschreitung pro Modul (Standard: 3000)
enableTraps: boolean;
enableBehavioralTracking: boolean;
enableHoneypots: boolean;
thresholds: { strict: number; balanced: number; relaxed: number };
}
Serverseitige Integration
Express-Middleware
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 verfällt nach 5 Minuten
noScript: { timeout: 10000 }, // 10s No-Script-Fenster
rateLimit: { maxRequests: 10, windowMs: 60000 },
noScriptPaths: ['/api/login', '/api/checkout', '/api/register']
});
app.use('/api', router);
Endpunkte
| Endpunkt | Methode | Zweck |
|---|
/api/botdetect/nonce |
{
"verdict": "human",
"score": 0.125,
"confidence": 0.85,
"tamperScore": 0,
"friction": "monitor",
"threshold": 0.5,
"proof": "a1b2c3d4e5f6..."
}
Serverseitige Bewertung (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 wenn Signalmanipulation erkannt
Erkennungsmodule
Automatisierungsframeworks (Gewichte 5–7)
Playwright-spezifisch (Gewichte 3–4)
| Modul | Erkennt | Gewicht |
|---|
playwrightWebKit | WebKit-Automatisierungsartefakte | 4 |
playwrightOrientation | Orientierung + Inkonsistenz von chrome.runtime | 3 |
Verhaltensanalyse (Gewicht 7)
| Modul | Analysierte Signale | Gewicht |
|---|
behavioralAnalysis | Mauskrümmung + Gerade-Linie-Verhältnis, Tastenanschlags-CV + Burst-Muster + KPM, Scrollbeschleunigung + Richtungswechsel, Touch-Kraftvarianz + Radius | 7 |
Browser-Fingerprinting (Gewichte 3–4)
Navigator- & Betriebssystemeigenschaften (Gewicht 5)
| Modul | Prüfungen | Gewicht |
|---|
navigatorInconsistencies | 11 Prüfungen: languages, plugins, mimeTypes, platform, UA, cookies, DNT, touch, hardwareConcurrency, deviceMemory, connection | 5 |
Bildschirm & Leistung (Gewicht 3)
Aktive Fallen & Honeypots (Gewichte 8–9)
| Modul | Erkennt | Gewicht |
|---|
honeypotTraps | Zufällige versteckte Felder + Täuschungsfelder + Canary-Endpunkt | 9 |
Netzwerk & Kontext (Gewichte 1–2)
Whitelist (Gewicht 0)
| Modul | Erkennt | Gewicht |
|---|
verifiedBots | 20+ bekannte Crawler (Googlebot, Bingbot, Yandex, Facebook, Twitter usw.) — gibt -1 zurück, von Bewertung ausgeschlossen | 0 |
Konfiguration
Collector
const collector = Collector.getInstance({
detectionTimeoutMs: 1000, // Niedriger für schnellere UX
enableTraps: true,
enableBehavioralTracking: true,
enableHoneypots: true,
thresholds: {
strict: 0.3, // Aggressiv (Login, Checkout)
balanced: 0.5, // Standard
relaxed: 0.7 // Nachsichtig (Inhaltsnavigation)
}
});
Detektor (nur Debug)
const detector = Detector.getInstance({
threshold: 'balanced', // 'strict' | 'balanced' | 'relaxed' | number
minSignals: 2, // Mindestsignale vor Verstärkung
signalBoostThreshold: 0.8, // Signale darüber erhalten zusätzliches Gewicht
failPolicy: 'open', // 'open' = human bei Fehler, 'closed' = bot bei Fehler
frictionThresholds: {
monitor: 0.2,
challenge: 0.5,
block: 0.8
}
});
Server
createBotDetectEndpoint({
secretSalt: process.env.BOTDETECT_SALT, // Geheim halten
scoring: { threshold: 'balanced' },
nonce: { ttl: 300000, cleanupInterval: 60000 },
noScript: { timeout: 10000 },
rateLimit: { maxRequests: 10, windowMs: 60000 },
requestFingerprint: true, // PoW an Anforderungsattribute binden
noScriptPaths: ['/api/login', '/api/checkout']
});
Produktions-Checkliste
Sicherheit
Leistung
Überwachung
Testen
npm test # 74 Jest-Tests in 6 Suiten
npm run typecheck # TypeScript Strict Mode
npm run lint # ESLint
npm run build # Webpack-Produktionsbundle
Lizenz
Apache — Lahmeri Mohamed Amine