Боксери збираються використовувати штучний інтелект, щоб наслідувати реальних користувачів. Тож я збудував детектор для роботів, який вчиться
Найголовніша концепція: Руйтинг поведінкиM SK1 Це дає можливість створити нову категорію -, де прозорі МSK1 пристосовні МSK2 команди " детекторів та систем навчання рефлікційно об 'єднують рух на основі з' ясованих моделей поведінки Перехідник YARP, Bots never reach your backend . Or use the middleware to build behavioural routing directly into your app layer
Розпізнавання роботів стало однією з найскладніших проблем у сучасній веб-інженериці.
Не тому, що боти стали розумнішими -, а тому, штучний інтелект робив банальним імітувати справжнє поведінку користувача:
Коммерціальні рішення розв 'язують це. МСК0, але вони - МСК1, вони дорогі. МSK2, МСК3, місяць типовий, МSK4, закритий, МСК5, джерело, М СК6 і прив' язаний до конкретних CDN. МС К7. Ви ніколи не знаєте, що відбувається підhoodом.
Я хотів чогось іншого.
Тож я створив найбільш зрозуміле.botdetection - модулярний МSK1 детектор для навчання роботів-ботів для МSK2 NET .
Спочатку це було просто, а потім стало чимось набагато цікавішим.
Ось реальний сценарій:
Шкраперові шлюпки:
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120
Здається легітимним.
Але це забув заголовок Chrome завжди надсилає:
Sec-Fetch-Mode
І його Accept-Language заголовок не підходить’ не відповідає ствердженій локальностіM SK1
І швидкість запиту чітко автоматизована.
Один сигнал непоганий. Другий підозрюваний . Третій - візеруальний
Система запускає сигнал під час 100 мілісекунд - не потрібна штучний інтелект
Це основа всього дизайну: не покладатися на одну велику модель
В основі цього проекту МСК0 - це не Бот-детекція , а "’". МСК2 , МСК3 - це спроба сприймати рух як живу систему, а не поток ізольованих запитів.
Сучасні скраївачі поводяться як пристосовні організми. МСК0, вони вчаться. МSK1, мутації. ММК2, аналіз слабкостей. ММСК3 і реагують на тиск.
Філософія тут проста: МСК0 – спостерігати сигнали, МСК1 – об 'єднувати їх, МSK2 – дозволяти їм взаємодіяти, , – адаптуватися з часом. МСК4 – замість одного робота - МСК5 – робота-бот, МСК6 – ні, ММСК7 - робота-bot, МПСК8 – перевірити, МНСК9 – машина перетворюється на мережу маленьких детекторів, МУСК10 – кожен з них вкладає дані у спільну таблицю, МАСК11 – де можуть з 'явитися вищі поведінки.
Система збудована так, щоб бути прозорою, що її можна пояснити, розширити та саморегулювати, скоректувати, регулювати з довгостроковою метою, яка полягає в тому, щоб поводитися менше як брандмауэр і більше як імунна система.
Прохання просувається через кілька маленьких детекторів, кожен з них додає невеликий шматок доказуM SK1
Подумайте про це як про контрольний пункт безпеки аеропорту.
flowchart TB
subgraph Request["Incoming Request"]
R[HTTP Request]
end
subgraph FastPath["Fast Path (< 100ms)"]
UA[User-Agent Check]
HD[Header Analysis]
IP[Datacenter IP Lookup]
RT[Rate Anomalies]
HE[Heuristic Model]
end
subgraph SlowPath["Slow Path (Async Learning)"]
LLM[LLM Reasoning]
Learn[Weight Learning]
end
subgraph Output["Decision"]
Score[Risk Score 0-1]
Action[Allow / Throttle / Block]
end
R --> UA & HD & IP & RT
UA & HD & IP & RT --> HE
HE --> Score --> Action
HE -.-> LLM -.-> Learn
Learn -.->|updates weights| HE
style FastPath stroke:#10b981,stroke-width:2px
style SlowPath stroke:#6366f1,stroke-width:2px
style Output stroke:#f59e0b,stroke-width:2px
Працює синхронно. Не заважаєM SK1 не сповільнює вашу програму.
Це ловить 80% bots миттєво.
Працює в фоні.
Це ловить адаптивних роботів - тих, що більшість людей думати вони'захоплюють з M SK1регексом на пользователе -Агента
dotnet add package Mostlylucid.BotDetection
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddBotDetection();
var app = builder.Build();
app.UseBotDetection();
app.Run();
Все працює з коробки .
| Проверка МSK1 Що він знаходить МSK2 | |
|---|---|
| Użytkownik-Агент | Знані ботиM SK1 бібліотеки, шрафери МSK3 |
| Заголовки | Позбавлені заголовків для безпеки , неможливі комбінації МSK2 |
| І Пі | Хворі хмари, які прикидаються бути |
| Рівень | Автоматичні пульси МSK1 розподілене стирання МSK2 |
| Сpójність | “Chrome/120” без ChromeM SK3 реальний набір заголовків МSK4 |
Консистентність є функцією спальника - сучасні Bots можуть хитатися один сигнал, але зазвичай він провалюється на перехресті-сигнальний зв 'язокM SK1
Ось так виглядає реальне виявлення. - це з демонстрації fastpath політика ( усі детектори паралельно ). в процесі виробництва МSK2 більшість заявок виходять рано після того, як лише
{
"policy": "fastpath",
"isBot": false,
"isHuman": true,
"humanProbability": 0.8,
"botProbability": 0.2,
"confidence": 0.76,
"riskBand": "Low",
"recommendedAction": { "action": "Allow", "reason": "Low risk (probability: 20%)" },
"processingTimeMs": 50.7,
"detectorsRan": ["UserAgent", "Ip", "Header", "ClientSide", "Behavioral", "Heuristic", "VersionAge", "Inconsistency"],
"detectorCount": 8,
"earlyExit": false
}
8 детектори працювали в 51ms - те, що ' паралельне виконання через багато джерел доказів
Кожен детектор спричиняє помірний вплив. Непоганий МSK1 людський сигналM SK2 Поганий
| Детектор МSK1 Враження МSK2 Вес | Вуждена မ်SK4 Причина мSK5 | ||
|---|---|---|---|
| Агент користувача МSK0 -0.20 ♫ ♫ | ♫ | ||
| Заголовок МSK0 -0.15 ♫ ♫ МSK2 ♫ | |||
| Застосування | МSK1 ♫ ♫ | ♫ | |
| Герістичні | -0.77 | 2.0 | -1.54 МSK0 88% людська вірогідність |
| ClientSide МSK0 -0.05 ♫ ♫ МSK2 ♫ | |||
| вік версії | -0.05 ♫ ♫ | ♫ | |
| Недосконалість МSK0 -0.05 ♫ ♫ МSK2 ♫ | |||
| І Пі МSK0 0.00 ♫ ♫ | ♫ |
І Хирічний детектор тут домінує: - це ' має вагу МSK2x і використовує характеристики МSK3, щоб досягти мSK4 людської самовпевненості
Кожен детектор випромінює сигнали, які входять у герістичний модель:
{
"ua.is_bot": false,
"ua.raw": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...",
"ip.is_local": true,
"ip.address": "::1",
"header.has_accept_language": true,
"header.has_accept_encoding": true,
"header.count": 16,
"fingerprint.integrity_score": 1,
"behavioral.anomaly": false,
"heuristic.prediction": "human",
"heuristic.confidence": 0.77,
"versionage.analyzed": true
}
Ці сигнали зберігаються і тренують систему навчання протягом часу.
Суммарні оцінки за категоріями для остаточного рішення:
| МSK0 Категория | Оцінка МSK2 Ваги | Записки мSK4 | ||
|---|---|---|---|---|
| Герістичний МSK1 МSK2 | 2.0 ♫ ♫ МSK5 ♫ Найсильніший людський сигнал ♫ | ♫ | |||
| Використовуючий агент МSK1 МSK2 | ♫ ♫ 1.0 | ♫ МSK5 ♫ Normalний браузер UA ♫ | ||
| Заголовок МSK1 МSK2 | MSК4 MSК5 Всі очікувані заголовки присутні МСК6 | |||
| МSK0 Застосування | МSK2 | |||
| ClientSide МSK1 МSK2 | MSК4 MSК5 Дотримано справжнє відбитки пальців МСК6 | |||
| Версію МSK1 МSK2 | ||||
| Недосконалість | ||||
| Іп МSK1 МSK2 | | 0.5 \ | МSK5 | локальний хост \ \dev нейтральний \ МSK7 \ |
Увага балу: M SK1 → Сильний людський сигнал
Nota: Це demo's
fastpathполітика, яка діє всі детектори для видимості. В реальному процесі виробництва з вимкненим раннім виходомМSK1 високийM SK2 запити на впевненість виходять лише після того, як під 10ms. МSK1 ms тут через те, що режим демонстрації не дозволяє ранньому виході показати всі вклади
Для порівняння: demo політика - повний трубопровод, включно з розрахунками LLM . Це показує, що відбувається, коли детектори не погоджуватися:
{
"policy": "demo",
"isBot": false,
"isHuman": true,
"humanProbability": 0.87,
"botProbability": 0.13,
"confidence": 1.0,
"botType": "Scraper",
"riskBand": "Low",
"recommendedAction": { "action": "Allow", "reason": "Low risk (probability: 13%)" },
"processingTimeMs": 1370,
"aiRan": true,
"detectorsRan": ["UserAgent", "Ip", "Header", "ClientSide", "Behavioral",
"VersionAge", "Inconsistency", "Heuristic", "HeuristicLate", "Llm"],
"detectorCount": 10
}
10 детектори в МSK1 секунд - LLM запустив і не погоджувались з герістикою.
| Детектор МSK1 Враження МSK2 Вес | Вуждена မ်SK4 Причина мSK5 | |||
|---|---|---|---|---|
| ЛЛМ | +0.85 | 2.5 | +2.13 | МSK1Кром, поширений у роботахM SK2 куки МSK3 підозрюваний референтор " \ |
| Хевроістичний запізнення МSK0 -0.77 ♫ ♫ МSK2 ♫ | ||||
| Герістичні МSK0першу) M SK2 ♫ ♫ МSK3 ♫ | ||||
| Агент користувача МSK0 -0.20 ♫ ♫ | ♫ | |||
| Заголовок МSK0 -0.15 ♫ ♫ МSK2 ♫ | ||||
| Застосування | МSK1 ♫ ♫ | ♫ | ||
| ClientSide МSK0 0.00 ♫ ♫ МSK2 ♫ | ||||
| вік версії | -0.05 ♫ ♫ | ♫ | ||
| Недосконалість МSK0 -0.05 ♫ ♫ МSK2 ♫ | ||||
| І Пі МSK0 0.00 ♫ ♫ МSK2 ♫ |
Це цікавий випадок - LLM назвав його потенційним роботом тоді як всі статичні детектори сказали: Людина .
{
"ai.prediction": "bot",
"ai.confidence": 0.85,
"ai.learned_pattern": "Browser string suggests Chrome, common in bots. Presence of cookies and a specific referer also points to a potential bot."
}
Припущення LLM' записується як сигнал, що повертається до системи навчання . Упродовж часу МSK2 якщо ця модель і далі з 'являється та підтверджується як робота-траfic M SK3 геріотичні ваги будуть пристосовані .
Застерег:
Герістичні гонки двічі МSK0 рано ( перед всіма детекторами ) і пізно МSK3 після всіх доказів СМС4 Обидві сказали СМС5 людський МСМС6 з SМС7 впевненість SМС8
LLM не погодився - він виявив візерунки, які не вистачали статистичних детекторів . його МSK2 weighted impact partially counters the heuristic
Ніяких відбитків пальців - ClientSide повернув 0 тому, що JS ще не запустив МSK2 МSK3 В реальному браузері M, це додало б більше людського сигналу МСК5
остаточне рішення: Дозволяти - навіть з підозрюваністю ЛЛМ МSK1 МSK2 об 'єднані докази все ще сприяють людству (87%). Але botType: "Scraper" прапор означає, що його спостерігають
Розділ категорій показує напруження:
| МSK0 Категория | Оцінка МSK2 Ваги | Записки мSK4 |
|---|---|---|
| Герістичні МSK0 -3.46 ♫ ♫ МSK2 ♫ | ||
| Інтелект МSK0 +2.13 ♫ ♫ МSK2 ♫ | ||
| Використовуючий агент МSK1 МSK2 | ||
| Заголовок МSK1 МSK2 | MSК4 MSК5 Всі заголовки присутні МСК6 | |
| Подібність до поведінки | ||
| ClientSide МSK1 МSK2 | MSК4 MSК5 Ще немає відбитків пальців МСК6 | |
| Версію МSK1 МSK2 | ||
| Недосконалість | ||
| IP МSK1 МSK2 |
Увага балу: M SK1 → Людина виграє ,, але несогласия ЛЛМ МSK2 виражені
Ключеві ідеї: Система не довіряє ні одному детектору, ні одному. Коли вони не погоджуються, докази обмірковуються і більшість виграє. Але думки меншості записуються для навчання.
Важливо: Цей безглуздий вихід - це demo-only. В процесі виробництва , ви отримуєте коротку відповідь через HTTP заголовки M SK3
X-Bot-Confidence,X-Bot-RiskBand, і т.д.context.IsBot()перевірити. Полний JSON - для відладки і налаштування M SK1 ви ' ніколи не надсилаєте це клієнтам МSK3
if (context.IsBot())
return Results.StatusCode(403);
var score = context.GetBotConfidence(); // 0.0–1.0
var risk = context.GetRiskBand(); // Low/Elevated/Medium/High
app.MapGet("/api/data", Secret).BlockBots();
app.MapGet("/sitemap.xml", Sitemap)
.BlockBots(allowVerifiedBots: true);
Рівень ризику веде до дії:
| МSK0 Ризик | Упевненість МSK2 Рекомендовані дії | |
|---|---|---|
| Трохи нижчий МSK1 МSK2 \0.3 | Дозволяти мSK5 | |
| МSK0 Піднято | МSK2 | Запис M/ ставкаМСК5limit МСК6 |
| МSK0 Середній | МSK2 | Задача мSK4 |
| високий МSK1 МSK2 ♫ ♫ МSK3 ♫ |
Не обов 'язково -, але корисно для ловлі передових автоматизованих системM SK1
Система включає в себе геристичний детектор, який використовує логістичну регресію з динамічно вивченими весами. Він починається з розумних початкових показників і еволюціонує на основі зворотнього зв 'язку з виявленнямM SK1
Типова затримка: 1–5ms
{
"BotDetection": {
"AiDetection": {
"Heuristic": {
"Enabled": true,
"LoadLearnedWeights": true,
"EnableWeightLearning": true
}
}
}
}
Функції виділяються динамічно - нові візерунки автоматично отримують початкову вагу і вивчають з часом . Система відкриває, що має значення для ваші Verkehr.
Приймає витікаючих роботів, які виглядають так: "fine" до швидких правилM SK2 Використовується Оллама для локального висновку LLM.
ollama pull gemma3:1b
{
"BotDetection": {
"AiDetection": {
"Provider": "Ollama",
"Ollama": { "Model": "gemma3:1b" }
}
}
}
ШІ - це не вдалось-безпечно - якщо це МSK1 знизився МSK2 розпізнавання продовжується нормально .
Статичні блоквізори застаріли. Атакатори пристосовуютьсяM SK1 Отже, ця система вчиться
flowchart LR
N[Neutral] -->|repeated bad activity| S[Suspect]
S -->|confirmed| B[Blocked]
B -->|no activity| S
S -->|stays clean| N
style B stroke:#ef4444,stroke-width:2px
style S stroke:#eab308,stroke-width:2px
style N stroke:#10b981,stroke-width:2px
Моделі руйнуються з часом:
Без руйнування ви заблокуєте законних користувачів назавжди.
{
"BotDetection": {
"Learning": {
"Enabled": true,
"ScoreDecayTauHours": 168,
"GcEligibleDays": 90
}
}
}
Там також є Докер-перший YARP зворотній прокси що запускає розпізнавання до цього запити на вашу програму.
flowchart LR
I[Internet] --> G[YARP Gateway]
G -->|Human| App[Your App]
G -->|Search Engine Bot| App
G -->|Malicious| Block[403]
Прокрутить його в одному рядку:
docker run -p 80:8080 \
-e DEFAULT_UPSTREAM=http://your-app:3000 \
scottgal/mostlylucid.yarpgateway
Працює на:
Для налаштування маршруту:
services:
gateway:
image: scottgal/mostlylucid.yarpgateway
volumes:
- ./yarp.json:/app/config/yarp.json
{
"BotDetection": {
"BotThreshold": 0.7,
"BlockDetectedBots": true,
"EnableAiDetection": true,
"Learning": { "Enabled": true },
"PathPolicies": {
"/api/login": "strict",
"/sitemap.xml": "allowVerifiedBots"
}
}
}
Це частина 1 МSK1напис МSK2 Наступні частини викопають глибше:
Майбутня дорожна карта:
Якщо ви хочете бути детектором робота, зрозуміти, розширювати, і бігати будь-де, це для вас
Не ліцензувати – публічний домен . використовувати його, як хочете
© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.