Back to "*反制: @(_Part 1)}部分"

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

ASP.NET Bot Detection Security

*反制: @(_Part 1)}部分

Monday, 08 December 2025

Scrapers即将开始使用 AI 模拟真实用户@-, 所以我建了一个机器人探测器, 可以学习 @, 适应#, 并反击\ .

密钥概念@: @行为运行_. 这将启用一个新的类别 {-} 。 在这样的类别中, 检测器和学习系统根据所学行为模式反射路线交通的透明性\ ,} 可调适 < MS K2 teams"}\ * ,} 不是静态规则=.} YARP 网关, bots 从来没有达到您的后端@. 或者使用中间器械来建立行为路径直接进入您的应用程序层 @.

Nuget 元数 吉特胡布 嵌入器


为何存在

现今网络工程中最棘手的问题之一,

不是因为机器人更聪明,而是因为 大赦国际认为模仿真正的用户行为无关紧要:

  • 流动居民代理物
  • 完全有效的浏览器指纹
  • 现实的鼠鼠运动
  • 执行 JavaScript
  • 屏蔽时适应

商业解决方案解决了这个,,但是它们很贵的(£3K+/月是典型的 ), 关闭@-source @, 和特定的 CDNMS K7你永远无法真正知道

我想要的是不一样的东西

  • 开放
  • 当地当地
  • 可理解
  • 易于推广
  • 即使是在草莓皮皮上, 也可以便宜地运行“(”和“MS K1”,

于是我建了 多数是卢希德.}(机器人检测) - 学习 Bot 检测引擎的模块@, 为 @.NET}.

它开始简单 …,然后发展成更有趣的东西



具体实例 @( @ what this actually catches_)

这里的’是一个真实的 -世界情景:

一个擦破的口香糖 :

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120

貌似合法 .

但它却 遗忘 染色体头总是会发送@: @%

Sec-Fetch-Mode

及其 Accept-Language 标题与所声称的本地端相匹配@. @

申请率明显是自动的 @.}

一个信号是精细的. 2个信号是可疑的 □MSK13个信号是一个图案}*.

系统在 @100_毫秒@-_没有AI需要#.}下标注它

这是整个设计的基础 : @ ’ @ t依赖一个大的@ MS K1 @ bot 或不是” @ model @ MPK3} 累积证据=.{


该系统的哲学

@,_#这个项目的核心是#’}其实是关于机器人检测的... ...-" it’}关于将交通视为一种生活系统 而不是一连串孤立的请求吗?

现代搬运工的行为更像适应性有机体 : 他们学习了", mutate, 识别弱点的探针\ MS K3 并回应压力. 所以防御必须进化 太=.

这里的哲学是简单的“: 观察信号” “, 观测信号”“MS K2 组合起来” “,” 让它们互动“, 并随着时间而适应 ‘. 并且逐渐调整 ‘ " bottMSKK6’ @ non MSKOK8 校验“ MSOK9 }引擎变成一个小型探测器网络 ‘ mskK10 每一个都为共享黑板“ I, ” 提供证据,在这个黑板上可以出现更高的“ MPK12 行为”\ “ 政策成为可翻转的流“ MSSK14 而不是硬盘” “ - coded rules” 规则 {. 翻转 而不是“MSC17 AI” 只是另一个贡献者<, 不是单项.}

建立这个系统的目的是透明地“,”和“自我的-”校正“MS K4”,其长远目标是行为不象防火墙,而更像快速在边缘的免疫系统“:” 。


它是如何工作的 @ ( @ 短版本@ MS K1 @

请求通过几个小型探测器流出 每件都提供一点证据

把它想象成机场安全检查点 …,但快一点

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

快速路径 @ (< @ @ I100 @ ms@ MS K2 @

同步运行@ . @ does’}没有减慢您的 App.}

  • 已知机器人模式
  • 丢失页眉的人总是发送真正的浏览器
  • 数据中心IPs @(AWS/AzureMS K2GCP})
  • 比率上升
  • UA “+” 信头之间不一致

这一渔获量 80% 机器人的瞬间.

慢路@( @Async_)}%

在背景中运行@. @%

  • 富营养模式,具有学习体重
  • LLM 推理 奥拉马
  • 更新模式声誉
  • 忘记陈旧的信号

这抓住了适应性生物体 和大多数人 思考 在用户@- @Agent_".}上他们正在追逐“"regex ”


尝试在 @ 10 @ 秒数

dotnet add package Mostlylucid.BotDetection
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddBotDetection();

var app = builder.Build();
app.UseBotDetection();
app.Run();

万事通,万事如意


**它检测到什么? (At a Glance )}

@ _检查# }它发现什么 # >
用户@-}代理 -=YTET -伊甸园字幕组=- 翻译:
页眉 失踪的安保信头 无法组合
IPIP 实施伙伴 @ #云端主机假装是@“#家用用户 @MS K2} @MSC3#
利率率比率 @ 自动爆破 #, 分散的刮痕#
一致性 @ @ @ “ @ @ Chrome@ MS K2# 没有Chrome @ I’ @ 实际信头设置 @ MPK4 @

恒度是潜伏的特征, 1个 符号一致性@.


真正的检测结果 @(_Broken down@)

这里的' @% 这样的真实检测看起来像 @ -} 这是来自运行演示 fastpath 在制作中 , 多数请求在刚刚完成 2-3 探测器同意后提前退出

摘要摘要

{
  "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”探测器在“51”中运行。 “- ” 指“'” 在多个证据来源平行执行“MS K2 ”

探测器贡献

每个探测器都具有加权撞击力 . 负 = 人类信号 MS K2 阳性 NSK3 bot 信号=. *

@ Q# 检测器@ Q 撞击 * Q 重量 # Q#
用户代理 @ @ -0.20 @ @ I @ @ *1.0# @ * MS K4# *% } 用户@- @ agents seemed normal # MSKO8#
页眉 @-0.15}# } @MS K3 -0.15 #信头似乎正常 #
行为 请求模式看起来正常
华量主义 -0.77 2.0 -1.54 @ @ @ 88% @ 人类可能性 @ I(16_ 功能 @ MPK3} @ O
客户服务 @ @ -0.05 @ @ I @ *0.8# # # @ @ *-0.04# @ < # 指纹似乎是合法的@ #
版本时代 }浏览器=/OS 版本现为 @
不一致 @ @ -0.05 @ @ I @ @ *0.8# @ * MS K4 @ * -0.04 @ *没有头巾@ @ 无头巾 @ MPK7 @ 乌阿不一致 # @
IPIP 实施伙伴 @ #当地主机@(#中性

缩略 湿性检测仪 使用“16”功能达到 “88%”人类信任度=.}

收集的信号

每个探测器都发出信号 输入超光速模型的信号

{
  "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
}

这些信号长期存在,并随着时间的推移对学习系统进行培训。

类别分类细目

最后决定的累计分数(按类别分列)

|类分 | 得分 | 重量| 记号 MS K4 * |----------|-------|--------|-------| @2.0#|}最强的人类信号 1.0}正常浏览器UA=| @1.0}@|}所有预期的会头都到场了 @MS K6# | 行为举止 @|} @MS K2 @#| @ 1.0#没有率反常现象 @|# “|”客户端Side {|} @-0.04|} 0.8} 收到有效指纹 | 0.8 @|当前浏览器版本 @MS K6 校对:Soup @|_IP |}(IP IP IMSK1) 200)}#0.00Q} @MS K3Q} (0.5Q) ∮ @|Q 本地主机 @MSC6DV 中性@)#|#

加权总分数=:}-2.11 强烈的人类信号

注:: 这是演示文稿 ' fastpath 政策策略运行时 全部 显示度检测器@. 在有早期退出功能的实际生产中 @,高/-信任请求退出 在“10”下@ .} 这里的@ MS K1 @ ms is because demod 模式会中断早期退出以显示所有贡献% . @ action

使用 LLM ) 的完整管道 {(} Demo 模式

用于比较 @,_在这里 @ '%s 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探测器在@1.4秒 法学硕士跑来跑去 有不同意见 与超自然理论的结合

@ Q# 检测器@ Q 撞击 * Q 重量 # Q#
法学硕士 +0.85 2.5 +2.13 @ @ @ "# Chrome 在 Bots@ MS K2 @ cookies @ I+ @ refererger 怀疑@" @ @ @ @
超饱性时间 @ # 人类7#(}有所有证据的 ) # #
华量主义 @ } @ @ @ @ 人类可能性#(16 @ 特质 @ ) @ @ * *
用户代理 @ @ -0.20 @ @ I @ @ *1.0# @ * MS K4# *% } 用户@- @ agents seemed normal # MSKO8#
页眉 @-0.15}# } @MS K3 -0.15 #信头似乎正常 #
行为 请求模式看起来正常
客户服务 @ @ 0.00 @ @ I @ *1.8# @ * # *没有指纹@ # #等待JS=# @* #
版本时代 }浏览器 @/OS版本
不一致 @ @ -0.05 @ @ I @ @ *0.8# @ * MS K4 @ * -0.04 @ *没有头巾@ @ 无头巾 @ MPK7 @ 乌阿不一致 # @
IPIP 实施伙伴 @ @ 0.00 @ @ I @ *0.5# # # @ @ @ @ 本地主机@( @ non性 @MS K8 @ @ _ #

这是一件有趣的案子, 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' 推理被记录为反馈到学习系统中的信号。 如果这种模式继续出现,并被确认为肉毒杆菌流量。 I, 超常重量将调整“. ”

通知@:

  1. 两次吃力运动 @-_BARBAR_在所有的探测器前#)}和迟到的(> 都说""{Human@"}加上#MS K7}信任 *.}

  2. LLM不同意 @- 它发现了静态探测器失灵的型式 ~. 它的“+2.13 加权撞击部分地对抗了超光速 ~' ~ -3.46.

  3. 无指纹 “-”客户端Side 返回了“0” 因为JS在真实的浏览器中“,” 会添加更多的人类信号“MS K5”

  4. 最后判决@: @ 允许 综合证据仍有利于人类, botType: "Scraper" 意指它' 正在被监视@.

分类细目显示张力@: @%

|类分 | 得分 | 重量| 记号 *MS K4 * |----------|-------|--------|-------| | 华量主义 @| @ @ -3.46 @ @ *|# @ *4.5# # 强大的人类信号 @MS K5# | 大赦国际 @| @ +2.13 @ @ @ I| @ @ *2.5# MS K4 @ LLM说:bot@| @ 1.0}正常浏览器 | @|#标题@|_ -0.15} @MS K3} @1.0 所有信头都到场了$|# @1.0}(正常模式) | “|”客户端Side {|} @0.00|}1.8\an8}@|}没有指纹,也没有指纹 0.8+|+当前版本 @|# 校对:Soup @|#IP IP #|#%0.00#@|0.5} @MS K5#当地主机#|#

加权总分数=:}-1.86 @→_人类赢%,}但LLM#'_反对者已注意到@.{

关键洞察力: 系统盲目信任任何单一的检测器@. @ 当他们不同意,}证据是加权的,多数人赢得了#-}但是少数派的意见会被记录下来

重要的: 此verbose 输出为 demo@ - @ only @ MS K1 @ 在 producting\ @ MPK2} 您可以通过 HTTP 信头 {(} 获得微小响应 。X-Bot-Confidence, X-Bot-RiskBand@ , @ etc@ MS K1} 或者简单 context.IsBot() ưμ㼯A


利用成果

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);

风险水平指导行动*:

建议采取的行动 | | -------- | ---------- | ------------------ | @| 低 | MS K2 @#0.3 | 允许 *| / 比例为 @-限制@| -=YTET -伊甸园字幕组=- 翻译: @|}高音 | MS K2 *#0.7 #| #Block@|#


AI 检测 (Optional)

不需要@- @}但对于抓取高级自动化很有用 @ .#

超强检测器 @(Fast,学习@)

该系统包括一种休眠检测器,它利用动态学习重量的后勤回归来进行逻辑回归。 它从明智的默认开始,根据探测反馈进化。

典型的延缓度 : # 1–5#

{
  "BotDetection": {
    "AiDetection": {
      "Heuristic": {
        "Enabled": true,
        "LoadLearnedWeights": true,
        "EnableWeightLearning": true
      }
    }
  }
}

以动态方式提取特性@-}新的模式会自动获得默认重量,并随着时间的流逝而学习#.}系统会发现什么重要 贵国的 交通 #.#

Ollama LLM @ (# 深智原因 @)#

捕捉快速规则的蒸发机器人 奥拉马 本地 LLM 推断@. @%

ollama pull gemma3:1b
{
  "BotDetection": {
    "AiDetection": {
      "Provider": "Ollama",
      "Ollama": { "Model": "gemma3:1b" }
    }
  }
}

AI 是 失败的-# safe -,如果它"'s down" <,BARBAR 继续正常的检测>.}


学习系统@:适应性 @,不触发%-快乐

静态区块列表正在变换 stale @ . @ 攻击者调整@ MS K1} @ 所以这个系统学习了 .

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 网关:对您的应用程序的边缘保护

这里还有 ’ Docker- 首个 YARP 反向代理 运行检测 之前 请求按下您的 App.

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

有关#:的工作

  • Linux 语言
  • MACOS macOS 大陆体
  • 视窗
  • 草莓皮皮・)

用于自定义路由@: @%

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 @ @ MS K1 @ 概览@ ). @ 下一部分挖掘更深@: @%

  • 部分#2: 和 StyloBot 架构@(ccode @-level)
  • 部分#3: 行为分析
  • 部分#4:客戶端@-侧指纹
  • 部分#5在真实时间里学习体重=-
  • 部分#6*:LLM内部检测器
  • 部分#7*:* 学习系统正确解释

未来路线图#:

  • 与矢量嵌入匹配的 RAG-基模式
  • 当地小型模型推论 拉拉马沙尔普 曼斯克诺
  • 探测新攻击模式的语义相似性

如果你想要机器人探测器,你可以 理解, 扩展,和 任意在任何地方运行本系列是给你的 .


链接链接链接

unlicense {–} 公共域 <% . } 无论你想怎样使用它\ MS K2\ {

logo

© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.