This is a viewer only at the moment see the article on how this works.
To update the preview hit Ctrl-Alt-R (or ⌘-Alt-R on Mac) or Enter to refresh. The Save icon lets you save the markdown file to disk
This is a preview from the server running through my markdig pipeline
Monday, 08 December 2025
Scraperit alkavat käyttää AI:tä todellisten käyttäjien jäljittämiseksi, joten olen rakentanut robot-detektorin, joka oppii mukautumaan ja taisteli vastaan.
Keskeinen käsite: Behavioural Routing Tämä mahdollistaa uuden kategorian -, jossa läpinäkyvät , mukautettavat YARP-portaali, botit eivät koskaan pääse backend-ympäristöönne . tai käyttäkää välineitä rakentamaan käyttäytymissuuntauksia suoraan app-rakenteenne tasoon
Bot-tutkimuksesta on hiljattain tullut yksi nykyaikaisen verkkotekniikan vaikeista ongelmista.
Ei siksi, että robotit olisivat älykkäämpiä - vaan koska AI teki mahdottomaksi todellisen käyttäjäkäytännön jäljittämisen:
Kaupalliset ratkaisut ratkaisevat tämän, mutta ne ovat kalliita. Monti on tyypillistä.
Halusin jotain muuta:
Näin minä tein mostlylucid.botdetection - modulaarinenM SK1 oppimisbot-detection engine for .NET.
Alku oli yksinkertainen…, ja sen jälkeen se kehittyi paljon kiinnostavammaksiM SK1
Tässä on todellinen skenaario maailmanlaajuisesti
A scraper spoofs:
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120
Vaikuttaa legitiimiltä.
Mutta se unohtaa otsikko Chrome lähettää aina:
Sec-Fetch-Mode
Ja sen Accept-Language header doesn’t match the claimed localeM SK1
Ja pyynnön määrä on selkeästi automatisoitu.
Yksi signaali on hyvä. Toinen epäilyttäväM SK1 Kolmas malli.
Järjestelmä liikkeelle panee sen alle 100 millisekunnin - ei tarvita AI-tekniikkaa
Tämä on koko suunnittelun perusta. älkää luotako yhteen suureen järjestelmään “bot tai ei-botM SK2malliin .Lisätetyt todisteet
Keskeisenä asiana on, että tämä hanke ei ole missään nimessä "bot detection" -hanke, vaan liikennettä pidetään elävänä järjestelmänä eikä eristettyjen pyyntöjen virtana.
Nykyaikaiset romuttajat käyttäytyvät pikemminkin sopeutumiskykyisiin organismeihin nähden.
Ajatus on yksinkertainen: tarkkailusignaaleja, , yhdistää ne,, antaa niille vuorovaikuttaa,M SK3 mukautua ajan kuluessa,. yhden ainoan järjestelmän sijasta,MSC5kolibri,MST6ei,MSP7koppeli,MSV8tarkastelu,MSL9 koneesta tulee pienten havaintolaitteiden verkosto,MSR10 kukin osallistuu todisteisiin yhteiseen taulukkoon,MTR11 jossa korkeampien järjestelmien käyttäytyminen voi ilmetä,MRT13 politiikat muuttuvat koostettavissa oleviksi virtauksiksi,MRL14, ei vaikeaksi,MTL15, kodifioituja sääntöjä,MKR16, maine muuttuu asteittain sen sijaan, että muuttuisi tilanteeseen.MTR17, AI on vain toinen osallistuja,MHR18, ei monolitti.
Järjestelmä on rakennettu avoimeksi, selkeytettäväksi , laajennettavaksi, ja itsenäiseksiM SK3 korjaamiseksiMSC4 pitkän aikavälin tavoitteen kanssa, jonka mukaan järjestelmä toimii vähemmän kuin palomuuri ja enemmän kuin immuunijärjestelmä.
Pyynnöt kulkevat useiden pienten havaintolaitteiden läpi, kukin antamaan pienen osan todisteistaM SK1
Ajatelkaa sitä lentokentän turvatarkastuspisteenä.
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
Synchronisoidaan. Ei’estetä sovelluksenne hitauttaM SK2
Tämä kiinnittää 80% bots instantly.
Käy taustalla.
Tämä kiinnittää mukautuvia roboteja -, joita useimmat ihmiset ajattelkaa he'pyytävät M SK1regexin kanssa käyttäjällä -Agentilla".
dotnet add package Mostlylucid.BotDetection
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddBotDetection();
var app = builder.Build();
app.UseBotDetection();
app.Run();
Se’si se .Kaikki toimii sääntöjen mukaisestiM SK2
| tarkistaa | mitä se löytää |
|---|---|
| käyttäjä-Agent | Tunnetut robotit, kirjastotM SK2 scraperit |
| Headerit | Missing security headers |
| IP | Pilvi Hostit, jotka teeskentelevät olevansa |
| Taso | automaattiiskut |
| Johdonmukaisuus | “Chrome/120” ilman Chromea |
Johdonmukaisuus on sleeper-ominaisuuksia - nykyaikaiset robotit voivat pettää yksi signaali, mutta yleensä epäonnistuu ristissä-signaalijohdonmukaisuusM SK1
Tässä on ', miltä todellista havaitsemistapaa näyttää. fastpath politiikka (kaikki detektorit rinnakkain). tuotannossaM SK2 useimmat pyynnöt poistuvat varhaisessa vaiheessa vain sen jälkeen, kun detekaattorit ovat samaa mieltä
{
"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-detektorit toimivat 51ms:ssa - ettäM SK1 rinnakkainen täytäntöönpano monista todistelähteistä
Jokaisella tunnistuslaitteella on painotettu vaikutus. kielteinen = inhimillinen signaaliM SK2 positiivinen = bot-signaali
| Detektori SSK1 Vaikutus | Paine S | Painettu M | Syy V | ||||||
|---|---|---|---|---|---|---|---|---|---|
| UserAgent | |||||||||
| Luettelo | |||||||||
| Elintavat | |||||||||
| Heuristinen | -0.77 | 2.0 | -1.54 | 88% ihmisen todennäköisyys | |||||
| ClientSide -palvelu | -0.05 | ||||||||
| VersionAge | -0.05 ≥ | \0.8 | -0.04 | Ohjelmia koskevat versiot näkyvät nykyisessä versiossa | |||||
| Johdonmukaisuus Ei otsikkoa/UA-johdonmukaisuuksia M SK8 | |||||||||
| IP Localhost (neutral devissä |
Euroopan unionin Heuristinen detektaattori täällä hallitsee - seM SK1 painotetaan 2x ja käytetään 16 ominaispiirteitä saavuttaakseen M88% inhimillisen luottamuksen
Jokainen detektaattori antaa signaaleja, jotka syötetään heuristimalliin:
{
"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
}
Nämä signaalit pysyvät ja kouluttavat oppimisjärjestelmää ajan mittaan.
Lopullisen päätöksen tulostaulukko kategorioiden mukaan:
| Luokitus | Tulos | Paino SSK3 Huomautukset S | ||||
|---|---|---|---|---|---|---|
| Heuristinen | SSK2 | | 2.0 | voimakkain inhimillinen signaali | |||
| UserAgent | -0.20 | 3 | 4 | 5 | Normal browser | |
| Otsake | -0.15 | | 4 | 5 | Kaikki odotetut otsakkeet ovat esillä | ||
| Elintarvikkeiden laatua koskevat säännökset | ||||||
| ClientSide | ||||||
| Versionikä | -0.04 | 3 | 4 | 5 | Nykyinen hakukoneversio | |
| epäjohdonmukaisuus | -0.04 | 3 | 4 | 5 | Yhdistyneiden Kansakuntien ottelujen otsikot | |
| IP |
Kokonainen painotettu tulos: M SK1 → Vahva inhimillinen signaali
Huomautus: Tämä on demo, '
fastpathpolitiikka, joka toimii kaikki näkyvyyden tunnistuslaitteet. Todellisessa tuotannossa, jossa varhaiset poistumisajat ovat aktivoidut 10ms. 51ms täällä johtuu siitä, että demo-modus estää varhaisen päätymisen osoittaakseen kaikki panokset
Vertailun vuoksi, täälläM SK1 on demo politiikka - koko kaasuputki mukaan lukien LLM:n perustelutM SK1 Tämä osoittaa, mitä tapahtuu, kun detektorit hylkääminen:
{
"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 detektorit 1.4 sekunnissa - LLM käynnisti ja erimielinen heuristiikkaan.
| Detektori SSK1 Vaikutus | Paine S | Painettu M | Syy V | |
|---|---|---|---|---|
| LLM | +0.85 | 2.5 | +2.13 | |
| Heuristisen myöhään | -0.77 ♫ ♫ | ♫ | ||
| Heuristinen ( varhaisessa vaiheessaM SK1 | -0.77 | 2.0 | ||
| UserAgent | ||||
| Luettelo | ||||
| Elintavat | ||||
| ClientSide -palvelu Ei sormenjälkiä ( odottaa JS | ||||
| VersionAge | -0.05 | |||
| Johdonmukaisuus Ei otsikkoa/UA-johdonmukaisuuksia M SK8 | ||||
| IP | 0.00 ≥ | ≤0.5 | 0.00 M | Yhtenäislähettiläs |
Tämä on mielenkiintoinen tapaus - LLM merkitsi sen mahdolliseksi botiksi kun kaikki statiset detektaattorit sanoivat ihmisen
{
"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:n näkökanta tallennetaan opetusjärjestelmään palaavaksi signaaliksi.
Tiedonanto:
Heuristinen رنjä kahdesti Molemmat ovat todenneet:
LLM ei ole samaa mieltä - se havaitsi muodot, joita statiset detektaattorit ovat jättäneet huomiotta
Ei sormenjälkiä ClientSide palautti 0, koska JS ei ollut vielä toteuttanut ':tä.
Lopullinen tuomio: salli - jopa LLM:n epäilyksenä, ' , yhdistetyt todisteet suosivat edelleen inhimillisiä botType: "Scraper" lippu merkitsee, että sitä tarkkaillaan
Luokkien jakautuminen osoittaa jännitteen:
| Luokitus | Tulos | Paino SSK3 Huomautukset S | |||||
|---|---|---|---|---|---|---|---|
| Heuristinen Vahva inhimillinen signaali | |||||||
| AI LLM:n mukaan roboti | |||||||
| UserAgent | -0.20 | ||||||
| Otsake | -0.15 | 3 | 4 | 5 | Kaikki esitetyt otsakkeet | ||
| Elintarvikkeiden laatua koskevat säännökset | |||||||
| ClientSide | |||||||
| Versionikä | -0.04 | 3 | 4 | 5 | Nykyiset versiot | ||
| epäjohdonmukaisuus | -0.04 | 3 | 4 | 5 | Yhdistyneiden Kansakuntien ottelujen otsikot | ||
| IP |
Kokonainen painotettu tulos: M SK1 → Ihmiset voittajatM SK1, mutta LLM-puolueen vastalause on havaittavissa .
Keskeinen näkemys: Järjestelmä ei luota sokein minkään ainoaan detektaattoriin. Kun he eivät ole samaa mieltä, todisteita painotetaan ja enemmistö voittaa, mutta vähemmistön mielipiteet kirjataan oppimiseen.
Tärkeää: Tämä verbose-toteamus on demo-onlyM SK1 Tuotteessa, saamme pienen vastauksen HTTP:n otsikoilla |(
X-Bot-Confidence,X-Bot-RiskBand, jne.context.IsBot()tarkistaa. Täsmällinen JSON on parannuskeinon ja mukauttamisen kannalta M SK1 ettekä koskaan lähetä tätä asiakkaille.
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);
Toimintaa ohjaavat riskitasot:
| Riski | Luottamus |
|---|---|
| alhainen SSK1 < \0.3 \ | sallitaan \SSK5 |
| Korkeutettu | |
| Keskipitkän aikavälin | |
| Korkean | > |
Ei vaadita -, mutta se on hyödyllinen kehittyneen automaattisen pyynnin kannalta
Järjestelmään sisältyy heuristinen tunnistaja, joka käyttää logistista regressiaa dynaamisesti opittujen painojen avulla.. Järjestelmä alkaa järkeisistä standardeista ja kehittyy havainnollisen palautteen perusteella.
Typinen latenssi: 1–5ms
{
"BotDetection": {
"AiDetection": {
"Heuristic": {
"Enabled": true,
"LoadLearnedWeights": true,
"EnableWeightLearning": true
}
}
}
}
Merkintöjä ekstrahoidaan dynaamisesti - uusia malleja otetaan automaattisesti entiseen painoun ja opitaan ajan mittaanM SK1 Järjestelmä paljastaa, mistä on kysymys teidän liikenne.
":n, ":n ja .:n kaltaiset vetäytyvät koneet Ollama paikallisen LLM:n johtopäätökselle.
ollama pull gemma3:1b
{
"BotDetection": {
"AiDetection": {
"Provider": "Ollama",
"Ollama": { "Model": "gemma3:1b" }
}
}
}
AI on fail-safe - jos se
Statiset blocklistit jäävät vaihtumattomaksi. Atakaajat mukautuvatM SK1 Näin ollen tämä järjestelmä oppii
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
Muodot heikkenevät ajan myötä:
Ilman tuhkautumista pystytte blockoimaan lailliset käyttäjät ikuisesti’
{
"BotDetection": {
"Learning": {
"Enabled": true,
"ScoreDecayTauHours": 168,
"GcEligibleDays": 90
}
}
}
"’:lla on myös Docker-first YARP reverse proxy , joka suorittaa havaitsemisen ennen pyyntöjä olette saanut appilta.
flowchart LR
I[Internet] --> G[YARP Gateway]
G -->|Human| App[Your App]
G -->|Search Engine Bot| App
G -->|Malicious| Block[403]
Käyttäkää se yhdessä rivissä:
docker run -p 80:8080 \
-e DEFAULT_UPSTREAM=http://your-app:3000 \
scottgal/mostlylucid.yarpgateway
Työt:
Omien sääntöjen mukaista siirtoa varten:
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"
}
}
}
Tämä on osia 1 (katsauksenM SK2 Seuraavat osat kaivataan syvemmälle:
Tuleva toimintasuunnitelma:
Jos haluatte robot-detektorin, voitte ymmärretään, laajentaa, ja lentää minne tahansa, tämä sarja on teilleM SK1
Ilman lupaa – julkinen domain. Käyttäkää sitä niin kuin haluatte
© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.