# **mostlylucid.botdetectionM SK1 Puolustus Scrapereiden vastustamiseen (Part 1)**

*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](https://hub.docker.com/r/scottgal/mostlylucid.yarpgateway), botit eivät koskaan pääse backend-ympäristöönne . tai käyttäkää välineitä rakentamaan käyttäytymissuuntauksia suoraan app-rakenteenne tasoon

<pinned/>
<!--category-- ASP.NET, Bot Detection, Security -->
<datetime class="hidden">2025-12-08T07:00</datetime>

[![NuGet](https://img.shields.io/nuget/v/mostlylucid.botdetection.svg)](https://www.nuget.org/packages/mostlylucid.botdetection/)
[![GitHub](https://img.shields.io/github/stars/scottgal/mostlylucid.nugetpackages?style=social)](https://github.com/scottgal/mostlylucid.nugetpackages/blob/main/Mostlylucid.BotDetection/README.md)
[![Docker](https://img.shields.io/docker/pulls/scottgal/mostlylucid.yarpgateway)](https://hub.docker.com/r/scottgal/mostlylucid.yarpgateway)

---


## **Miksi tämä on olemassa**

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**:

* Sijoituspalvelun kiertäminen
* Täsmälleen pätevät sormenjälmät
* Realistinen hiirenkulku
* JavaScriptin toteuttaminen
* Hyväksyminen, kun estetään

Kaupalliset ratkaisut ratkaisevat tämän, mutta ne ovat kalliita. Monti on tyypillistä.

Halusin jotain muuta:

* Avoimuus
* Paikallinen
* Ymmärrettävä
* Laajentaminen on helppoa
* Halpakäyttöinen (kylläM SK1 jopa Raspberry Pi'issä

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

---


[TOC]

---


## **Konkreettinen esimerkki (Miltä tämä tosiasiassa saa**

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**

---


## Järjestelmän filosofia

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ä.

---


## **Miten se toimii ( Lyhyesti sanottuna**

Pyynnöt kulkevat useiden pienten havaintolaitteiden läpi, kukin antamaan pienen osan todisteistaM SK1

Ajatelkaa sitä lentokentän turvatarkastuspisteenä.

```mermaid
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
```

### **Nopea tie (< 100msM SK2**

Synchronisoidaan. Ei’estetä sovelluksenne hitauttaM SK2

* Tunnetut bot-mallit
* Missing headers real browsers always send
* Datacenter IP:t (AWS/AzureM SK2GCP )
* Määrärahat
* UA:n + otsikoiden välinen epäjohdonmukaisuus

Tämä kiinnittää **80%** bots instantly.

### **Hidas tie (Async)**

Käy taustalla.

* Heuristinen malli opetettujen painojen avulla
* LLM:n perusteluja käyttäen [Ollama](https://ollama.com/)
* Muodon maineen päivittäminen
* Unohdetaan pysähtyneet signaalit

Tämä kiinnittää mukautuvia roboteja -, joita useimmat ihmiset *ajattelkaa* he'pyytävät M SK1regexin kanssa käyttäjällä -Agentilla".

---


## **Yritä se 10 sekunnissa**

```bash
dotnet add package Mostlylucid.BotDetection
```

```csharp
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

---


## **Mitä se havaitsee**

| 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

---


## **Todellisen havaitsemisen tulos (Broken Down**

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ä

### Lyhyesti sanottuna

```json
{
  "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ä

### Detector-osuudet

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

### Saamiaan signaaleja

Jokainen detektaattori antaa signaaleja, jotka syötetään heuristimalliin:

```json
{
  "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.

### Luokat jakautuvat

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, ' `fastpath` politiikka, 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

### Täydennetty putki (Demo-modus LLM:n kanssa

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**:

```json
{
  "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

```json
{
  "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:

1. **Heuristinen رنjä kahdesti** Molemmat ovat todenneet:

2. **LLM ei ole samaa mieltä** - se havaitsi muodot, joita statiset detektaattorit ovat jättäneet huomiotta

3. **Ei sormenjälkiä** ClientSide palautti 0, koska JS ei ollut vielä toteuttanut ':tä.

4. **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.

---


## **Tulosten käyttö**

```csharp
if (context.IsBot())
    return Results.StatusCode(403);

var score = context.GetBotConfidence();  // 0.0–1.0
var risk  = context.GetRiskBand();       // Low/Elevated/Medium/High
```

### Lopullisten kohtien suojelu

```csharp
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 | >

---


## **AI-tutkimukset ( VaihtoehtoinenM SK1**

Ei vaadita -, mutta se on hyödyllinen kehittyneen automaattisen pyynnin kannalta

### **Heuristinen tunnistaja (NopeutettuM SK1 Oppiminen )**

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**

```json
{
  "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.

### **Ollama LLM (**

":n, ":n ja .:n kaltaiset vetäytyvät koneet [Ollama](https://ollama.com/) paikallisen LLM:n johtopäätökselle.

```bash
ollama pull gemma3:1b
```

```json
{
  "BotDetection": {
    "AiDetection": {
      "Provider": "Ollama",
      "Ollama": { "Model": "gemma3:1b" }
    }
  }
}
```

AI on **fail-safe** - jos se

---


## **Opetusjärjestelmä: Adaptiivinen, Ei liikkeelle panevaM SK2Hyvä**

Statiset blocklistit jäävät vaihtumattomaksi. Atakaajat mukautuvatM SK1
Näin ollen tämä järjestelmä oppii

```mermaid
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ä:

* IP-osoitteet siirretään uudelleen
* Määrätyt skriptit korjataan
* Liikenne muuttuu luonnollisesti

Ilman tuhkautumista pystytte blockoimaan lailliset käyttäjät ikuisesti’

```json
{
  "BotDetection": {
    "Learning": {
      "Enabled": true,
      "ScoreDecayTauHours": 168,
      "GcEligibleDays": 90
    }
  }
}
```

---


## **YARP Gateway: Edge Protection – sovelluksen suoja**

"’:lla on myös **Docker-first YARP reverse proxy** , joka suorittaa havaitsemisen *ennen* pyyntöjä olette saanut appilta.

```mermaid
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ä:

```bash
docker run -p 80:8080 \
  -e DEFAULT_UPSTREAM=http://your-app:3000 \
  scottgal/mostlylucid.yarpgateway
```

Työt:

* Linux
* MacOS
* Windows-järjestelmä
* **ARM (kyllä , Raspberry PiM SK2**

Omien sääntöjen mukaista siirtoa varten:

```yaml
services:
  gateway:
    image: scottgal/mostlylucid.yarpgateway
    volumes:
      - ./yarp.json:/app/config/yarp.json
```

---


## **Perusteltu tuotantovalmius**

```json
{
  "BotDetection": {
    "BotThreshold": 0.7,
    "BlockDetectedBots": true,
    "EnableAiDetection": true,
    "Learning": { "Enabled": true },
    "PathPolicies": {
      "/api/login": "strict",
      "/sitemap.xml": "allowVerifiedBots"
    }
  }
}
```

---


## **Mihin tämä menee**

Tämä on osia 1 (katsauksenM SK2
Seuraavat osat kaivataan syvemmälle:

* **Osa 2**: [Uudenlaiset sisäiset olot, allekirjoitusmuistio, vastauksen palauttamisloopitM SK2 ja StyloBot-arkkitehtuuri (koodi](/blog/post/botdetection-part2-signature-pipeline-and-stylobot-architecture)
* **Osa 3**: Behavior analysis
* **Osa 4**: ClientM SK1silmäjäljittäminen
* **Osa 5**: Heuristinen tunnistaja - oppipainot reaaliaikaisesti
* **Osa 6**: LLM-detection internals
* **Osa 7**: Opetusjärjestelmä selitetään asianmukaisesti

**Tuleva toimintasuunnitelma:**

* RAG-perustainen malli, joka sopii vektoriembeddingeihin
* Paikallinen pieni mallin johtopäätös via [LlamaSharp](https://github.com/SciSharp/LLamaSharp) / ONNX
* Semantinen samankaltaisuus uusien hyökkäysmallien havaitsemiseksi

Jos haluatte robot-detektorin, voitte *ymmärretään*, *laajentaa*, ja *lentää minne tahansa*, tämä sarja on teilleM SK1

---


## **Linkki**

* **GitHub:** täydet asiakirjat
  [https://~github~.~com^/~scottgal~/~mostlylucid~M SK4~nugetpackages](https://github.com/scottgal/mostlylucid.nugetpackages)
* **NuGet:** asennetaan paketti
  [https://www .nuget.orgM SK3packagesMST4mostlylucidMSC5botdetection](https://www.nuget.org/packages/mostlylucid.botdetection)
* **Docker Hub:** YARP-portaali
  [https://hubMSC1docker.comM SK3rMST4scottgalMSL5mostlylucidMSR6yarpgateway](https://hub.docker.com/r/scottgal/mostlylucid.yarpgateway)

**Ilman lupaa – julkinen domain. Käyttäkää sitä niin kuin haluatte**