I Combattenti stanno per iniziare a usare l'IA per imitare gli utenti reali - quindi ho costruito un rilevatore di robot che impara , si adatta
Concepto chiave: Conduttura comportamentale. Questo permette di creare una nuova categoria - dove i rilevatori e i sistemi di apprendimento , regolabili "teams" guidano il traffico riflessivo basandosi su modelli di comportamento imparatiMSC4 non regole staticheM SK5 Con la Gateway YARP, i bot non raggiungono mai la vostra backend. O usate il middleware per costruire un percorso comportamentale direttamente nella vostra strata di appM SK2
La rilevazione dei bot è diventata uno dei problemi più difficili dell'ingegneria web moderna.
Non perché i robot siano diventati più intelligenti - ma perché L'IA ha reso banale imitare il vero comportamento degli utenti.:
Le soluzioni commerciali lo risolvono, ma sono costose. Il mese è tipico.
Volevo qualcosa di diverso:
Quindi ho costruito mostlylucid.botdetection - un motore modulare, di rilevamento dei robot dell'apprendimento per .NETM SK3
Cominciò con il semplice… e poi è diventato qualcosa di molto più interessante.
Qui ’è un vero scenario -il mondo :
Scropper spoofs:
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120
Sembra legittimo.
Ma è così. Si dimentica. un titolo Chrome manda sempre:
Sec-Fetch-Mode
E il suo Accept-Language il titolo non’non corrisponde alla localizzazione pretendeta.
E il tasso di richiesta è chiaramente automatizzato.
Un segnale è buono. Due è sospettosoM SK1 Tre è un modello.
Il sistema lo indica sotto 100 millisecondi - non c'è bisogno di intelligenza artificiale
Questo è il fondamento dell'intero progetto: Non dipendere da un grande modello.
In fondo, questo progetto non riguarda il rilevamento dei robot, ma il trattare il traffico come un sistema vivente piuttosto che un flusso di richieste isolate.
I moderni spazzaturatori si comportano più come organismi adattativi: imparano, mutareM SK2 rilevare le debolezze , e reagire alla pressioneMSC4 Quindi la difesa deve evolversi ancheMST5
La filosofia qui è semplice: osservare i segnaliM SK1 li combinare , lasciarli interagire, e adattarsi nel tempoMSC4 Invece di un singolo MST5botMSL6nonMSSK7bot\MST8 controllareMS, il motore diventa una rete di piccoli rilevatoriMSP10 ognuno contribuisce alla creazione di prove in una lavagna comuneMSV11 dove possono emergere comportamenti più altiMSS12 ordini di ordineMSR13 Le politiche diventano flussi composibiliMRS14 non difficiliM SS15 regole codificateSSS16 La reputazione si sposta gradualmente invece di cambiare statiMRSS17 L'IA è solo un altro contribuitoreMSNS18 non un monolitoMISS19
Il sistema è costruito per essere trasparente, spiegabileM SK1 estendibile, e auto-elaborabile - correttivoMST4 con l'obiettivo a lungo termineMSSK5 di comportarsi meno come una firewall e più come un sistema immunitarioMSM6 veloce al limiteMSV7 intelligente nel nucleoM SV8 e sempre ad imparareM Sv9
Le richieste passano attraverso diversi piccoli rilevatori, ognuno contribuisce a un piccolo pezzo di prove.
Pensate a questo come ad un posto di controllo per la sicurezza dell'aeroporto.
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
Funziona sincronicamente. Non funzionaM SK1 non rallenta la vostra app.
Questo cattura. 80% di bot immediatamente.
Funziona nel background.
Questo cattura i robot adattativi - quelli che la maggior parte delle persone usa. Pensare. Stanno pescando con "regex sull'User
dotnet add package Mostlylucid.BotDetection
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddBotDetection();
var app = builder.Build();
app.UseBotDetection();
app.Run();
Quello’è questo. Tutto funziona fuori dagli schemi .
| Controlla | Cosa trova | |
|---|---|---|
| User-Agent | Bot noti, bibliotecheM SK2 spazzatori | |
| Insieme | Missing security headers, impossible combinations | |
| IP | Host della nuvola che fingono di essere “utilizzatori domestici” | |
| Il tasso | Riscaldature automatiche, scarico distribuito | |
| La coerenza |
La consistenza è la funzione sleeper - i bot moderni possono imitare. Uno. Signale ma di solito fallisce al croiso-coerenza del segnale.
Qui ' è come appare una rilevazione reale - viene dalla dimostrazione che fa funzionare il fastpath politica ( tutti i rilevatori in paralleloM SK1 nella produzione, la maggior parte delle richieste esce presto dopo che 2-3 i rilevanti sono d'accordoMSC4
{
"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
}
I rilevatori 8 funzionavano in 51ms. - che ' l'esecuzione parallela attraverso diverse fonti di prove.
Ogni rilevatore contribuisce ad un impatto ponderato. negativo = segnale umanoM SK2 positivo = segnali robotMSC4
| Detettore | Impatti | Peso M | Pesa m | Motivo R | |||||
|---|---|---|---|---|---|---|---|---|---|
| UserAgent | -0.20 | | 1.0 ♫ | , | -0.20 , | Utilizzatore- L'agente appare normale | ||||
| Insieme | -0.15 ≤ | ≥1.0 ± | -0.15 | Le colonne sono normali. | |||||
| Il comportamento | -0.10 ≥ | \1.0 | 4 | 5 | 6 | I modelli di richiesta sembrano normali | 7 | ||
| Heuristica | -0.77 | 2.0 | -1.54 | 88% probabilità umana | |||||
| ClientSide L'impronta digitale sembra legittima | |||||||||
| età della versione | -0.05 | ||||||||
| Inconsistenza | -0.05 ≤ | ≥0.8 ± | -0.04 | No header/Inconsistenze dell'U.A. | |||||
| IP | 0.00 ≤ | ≥0.5 ± | \0.00 | Localhost | ( | neutra nel dev | ) |
L'informazione figura nella parte dispositiva. Detttore euristico domina qui - è ' ha un peso ≥2x e ha usato 16 caratteristiche per raggiungere M88% la fiducia umana R.
Ogni rilevatore emette segnali che entrano nel modello heuristico:
{
"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
}
Questi segnali persistono e formano il sistema di apprendimento nel tempo.
Sconti aggregati per categorie per la decisione finale:
| categoria | punteggio | peso S | note M | |||||
|---|---|---|---|---|---|---|---|---|
| Heuristico | -1.54 | | 2.0 | 5 | Signale umano più forti | ||||
| Agente d'Userone | -0.20 | |||||||
| Insieme | -0.15 | 3 | 4 | 5 | Tutte le insieme attendute sono presenti | |||
| Comportamento | -0.10 | | 4 | 5 | Niente anomalie di tasso | ||||
| ClientSide | -0.04 | 3 | 4 | 5 | Ottenuta una valide impronta digitale | |||
| VersionAge | ||||||||
| Inconsistenza | -0.04 | | 0.8 | ||||||
| IP | 0.00 | | 0.5 ♫ | Localhost SSK6dev neutrale |
Totale punteggio ponderato: -2.11 → Signale umano forte → AllowM SK2
Nota: Questo è il demo '.
fastpathUna politica che funziona. Tutti. Detettori per la visibilità. Nella produzione reale con l'exit anticipato attivato, altoM SK2 richieste di fiducia si spegneno solo dopo MSC3 i rilevatori sono d'accordo - tipicamente sotto 10ms. Il 51ms qui è dovuto al fatto che il modo di dimostrazione blocca l'uscita rapida per mostrare tutte le contributi.
Per il confronto, qui's la demo politica - il tubo completo, compreso il ragionamento LLM. Questo mostra cosa succede quando i rilevatori Non sono d'accordo.:
{
"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 rilevatori in 1.4 secondi - l'LLM è andata avanti. Non sono d'accordo. con l'euristica.
| Detettore | Impatti | Peso M | Pesa m | Motivo R | |||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| LLM | +0.85 | 2.5 | +2.13 | ||||||||
| Euristiche tardi | -0.77 ≥ | ≤2.5 | ±-1.92 \ | \ 88% umano SSK8con tutte le prove | SSK10 | |||||||
| Heuristica (Prima) | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Probabilità umana | |||
| UserAgent | -0.20 | | 1.0 ♫ | , | -0.20 , | Utilizzatore- L'agente appare normale | ||||||
| Insieme | -0.15 ≤ | ≥1.0 ± | -0.15 | Le colonne sono normali. | |||||||
| Il comportamento | -0.10 ≥ | \1.0 | 4 | 5 | 6 | I modelli di richiesta sembrano normali | 7 | ||||
| ClientSide No fingerprint (awaiting JS | |||||||||||
| età della versione | -0.05 | \ | 3 | 4 | 5 | 6 | Browser | Versioni OS | Current | ||
| Inconsistenza | -0.05 ≤ | ≥0.8 ± | -0.04 | No header/Inconsistenze dell'U.A. | |||||||
| IP | 0.00 |
Questo è il caso interessante - LLM l'ha etichettata come un potenziale robot. mentre tutti i rilevatori statici dicevano umano.
{
"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."
}
Il ragionamento del LLM' viene registrato come un segnale che ritorna al sistema di apprendimento. Nel tempoM SK2 se questo schema continua a comparire e viene confermato come traffico di robotMSC3 i pesci heuristici si adattanoMska4
Aviso:
Correzioni euritiche due volte. - all'inizio ( prima di tutti i rilevatori ) e tardi S( dopo tutte le prove ). Entrambi hanno detto SSK5 umano SSK6 con ESM7 fiducia ESM8
LLM non è d'accordo. - ha individuato schemi che i rilevatori statici non hanno rilevatoM SK1 Il suo +2.13 impatto ponderato sostanzialmente corrisponde all'eurismo's
Senza impronte digitali. - ClientSide ha risposto 0 perché JS non aveva ancora ejecutato '. In un browser realeM SK4 questo aggiungerebbe più segnali umaniMSC5
Verdetto finale: Permettete - anche con la sospettazione del LLMM SK1, l'evidenza combinata è ancora in favore dell'uomo. botType: "Scraper" La bandiera significa che è stato osservato.
La classifica delle categorie mostra la tensione:
| categoria | punteggio | peso S | note M | ||||
|---|---|---|---|---|---|---|---|
| Heuristica | |||||||
| L'IA LLM dice che il bot | |||||||
| Agente d'Userone | -0.20 | 3 | 4 | 5 | Browser normali | ||
| Insieme | -0.15 | 3 | 4 | 5 | Tutte le sequenze presenti | ||
| Comportamento | -0.10 | 3 | 4 | 5 | Patterni normali | ||
| ClientSide | |||||||
| VersionAge | |||||||
| Inconsistenza | -0.04 | | 0.8 | |||||
| IP |
Totale punteggio ponderato: -1.86 → L'uomo vince, ma il dissenso del LLMM SK2 è notato .
Percezione chiave: Il sistema non si fida blindamente di nessun singolo rilevatore. Quando non sono d'accordo, le prove vengono weightate e la maggioranza vince. Ma le opinioni delle minoranze vengono registrate per l'apprendimento.
Importante: Questo output verbose è demo-only. In produzione , si ottiene una risposta bassa tramite i titoli HTTP M SK3
X-Bot-Confidence,X-Bot-RiskBand, etcM SK1 o un semplicecontext.IsBot()Check. Il JSON completo è per debuggere e regolare - non lo spedi mai ai clienti
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);
I livelli di rischio guidano l'azione:
| Rischio | Confidenza | Azioni raccomandate M | ||||
|---|---|---|---|---|---|---|
| Basso | < | 3 | 4 | Permettete | 5 | |
| Elevato | 0.3–0.5 | Log / tasso S-limito M | |||||
| Medio | 0.5–0.7 | sfide | |||||
| alto | > ≥0.7 | blocco \ |
Non è necessario - ma utile per catturare automatizzazione avanzata.
Il sistema include un rilevatore heuristico che usa la regressione logistica con pesci dynamicamente imparati. Comincia con dei predefinimenti sensibili e si evolve basando su feedback di rilevamento.
La latenza tipica: 1–5ms
{
"BotDetection": {
"AiDetection": {
"Heuristic": {
"Enabled": true,
"LoadLearnedWeights": true,
"EnableWeightLearning": true
}
}
}
}
Le caratteristiche vengono estratte dinamicamente - i nuovi schemi ricevono automaticamente il peso di default e imparano nel tempoM SK1 Il sistema scopre cosa conta per il vostro. traffic.
Cattura robot evasivi che sembrano "fine" con regole velociM SK2 Usazioni Ollama per l'inferenza locale LLM.
ollama pull gemma3:1b
{
"BotDetection": {
"AiDetection": {
"Provider": "Ollama",
"Ollama": { "Model": "gemma3:1b" }
}
}
}
L'IA è fallire-sicura - se ' scendeM SK2 la detezione continua normalmente.
Le liste di blocchi statici sono inesistente. Gli attacchi si adattano. Quindi questo sistema impara.
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
I modelli si decadono nel tempo:
Senza decadere voi’d bloccare gli utenti legittimi per sempre.
{
"BotDetection": {
"Learning": {
"Enabled": true,
"ScoreDecayTauHours": 168,
"GcEligibleDays": 90
}
}
}
C'è anche un MSK. Docker- primo proxy YARP inverso che conduce la rilevazione. prima. le richieste colpiscono la vostra app.
flowchart LR
I[Internet] --> G[YARP Gateway]
G -->|Human| App[Your App]
G -->|Search Engine Bot| App
G -->|Malicious| Block[403]
Lo fate in una sola linea:
docker run -p 80:8080 \
-e DEFAULT_UPSTREAM=http://your-app:3000 \
scottgal/mostlylucid.yarpgateway
Works on:
Per routing personalizzato:
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"
}
}
}
Questa è la parte 1 (la panoramica). Le parti successive scavano più a fondo:
Mappa stradale futura:
Se volete un rilevatore di bot potete Capire., espandere., e andare ovunque., questa serie è per voi
Non licenziare – dominio pubblico. Usarlo come voleteM SK2
© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.