跳转到内容

反爬虫与人机识别:如何仅凭行为识别自动化bot | 人机之辨

上一部的反作弊篇讲的是搜索引擎如何识破「伪造的流量」。现在把镜头拉远:那其实只是一个更普适问题的特例。

给定一个只能从外部观测的实体,如何判断它背后是真人,还是一段自动化程序?

这个问题的答案,撑起了整个反爬虫、bot 检测、人机验证的技术领域。而多数人对它的想象——查 User-Agent、封 IP、弹个验证码——只触到了最表层。这些手段之所以正在失效,是因为它们检测的是声明(你说你是谁),而真正的战场在行为(你做出来像不像)。

本篇要论证一个反直觉、但越挖越硬的命题:

人机之辨不是一场势均力敌的猫鼠游戏,而是一场结构上防御方占优的博弈。 因为伪造一个「像真人」的实体,需要在成百上千个维度上、跨统计分布与物理定律,同时不露破绽;而检测方,只需要抓住其中一处不自洽。

这一部叫「识别与对抗」,本篇是它的地图。


一、人机之辨是一个统计判别问题

Section titled “一、人机之辨是一个统计判别问题”

先纠正一个心智模型。bot 检测不是「拿一份已知 bot 特征库来逐条匹配」——那是杀毒软件的思路,只能抓已知的、笨的。

现代人机识别是一个统计判别问题:设真人行为的分布是 PP(从海量真实用户估出来),待检实体的行为分布是 QQ。检测要回答的是:QQPP 有多远?衡量这个距离的自然工具是 KL 散度

DKL(QP)=xQ(x)logQ(x)P(x)D_{\mathrm{KL}}(Q \,\|\, P) = \sum_{x} Q(x)\,\log\frac{Q(x)}{P(x)}

xx 遍历所有被观测的行为特征。DKLD_{\mathrm{KL}} 越大,QQ 越不像真人。这个视角有一个立刻显现的结构性后果——攻防的根本不对称

维度诅咒,这次站在防御方一边进攻方须在每一维都像P(过关) ≈ ∏ᵢ pᵢ维度越多,连乘越趋近于 0防御方只需抓一维露馅P(识破) ≈ maxᵢ (1−pᵢ)维度越多,越容易逮到破绽

进攻方要「过关」,得让每一个被观测维度都像真人——这是一个连乘:任何一维的通过率不足,整体就被拖垮。防御方要「识破」,只需在任意一个维度上发现不自然——这是一个取最大。维度越多,天平越向防御方倾斜。这就是「维度诅咒」难得一次站在防御这边。


二、伪造难度的三级台阶:边缘 → 联合 → 因果

Section titled “二、伪造难度的三级台阶:边缘 → 联合 → 因果”

那么,攻方到底难在哪?关键洞察是:并非所有维度一样难伪造。 它们构成三级陡峭上升的台阶,这是贯穿本篇的暗线。

伪造难度的三级台阶① 边缘分布每一维各自的形状可逐维调像(拟合均值/方差)② 联合结构维度之间的相关须联合复现,不能各调各的③ 物理因果耦合同一物理过程生成须复现「生成机制」本身断一条链即穿无调参空间伪造成本 →越往上,攻方要复现的东西越接近「物理真实」本身

第一级·边缘分布。 每个维度各自的形状——停留时长的分布、点击间隔的分布、触摸压力的分布。这是最容易伪造的:观测真人分布,拟合它的均值与方差,逐维调像即可。粗糙的脚本死在这一级(比如均匀分布的点击间隔),但认真的对手能过。

第二级·联合结构。 维度之间的关系。有些维度实测是独立的(可以分别采样),有些则强相关——比如接触面的长轴与短轴、手势时长与压力包络。要过这一级,攻方不能各调各的,必须联合复现相关结构。这已经难得多。

第三级·物理因果耦合。 最狠的一级。真人的行为不是一堆可独立设定的随机变量,而是被同一套物理过程生成的——手指的生物力学、设备的惯性、神经-运动的时序。这些维度必须同时、协调地正确。要过这一级,攻方要复现的不再是「结果的分布」,而是**「生成结果的那套物理机制」**本身。


三、物理自洽:触摸与传感器的因果枷锁

Section titled “三、物理自洽:触摸与传感器的因果枷锁”

第三级台阶最丰饶的矿藏,是移动端的物理传感数据。这里全是从防御视角可推导、可验证的普适物理约束。

一次真实的手指触摸,在多个维度上被生物力学绑定:

  • 压力包络不是对称的钟形,而是「早峰单调衰减」——手指落屏瞬间压强最大,随即释放。这是指腹接触的力学决定的。用一条对称曲线去凑的伪造,形状就错了。
  • 接触面与报告半径成固定几何比(接触直径约为半径的两倍)——这是硬件与系统栈决定的常数,报告的宽度与半径对不上这个比例,即是伪造。
  • 落屏存在「触摸冻结」前缀——手指初接触的极短时间内坐标几乎不动、压力从近零渐进爬升;而脚本注入的触摸常常首帧就是峰值、坐标立刻位移。
  • 长按时手指并非静止,而在小范围内做累积随机游走(生理性微颤),并夹杂阵发的微停顿。hold 阶段坐标完全恒定,是脚本的铁证。

比触摸更难伪造的,是加速度计、陀螺仪、磁力计三者之间的物理守恒关系。它们不是三条可以独立捏造的数据流,而是同一个物理世界的三个投影:

a=ax2+ay2+az2    g9.8 m/s2(静止时)\lVert \mathbf{a}\rVert = \sqrt{a_x^2 + a_y^2 + a_z^2}\;\approx\; g \approx 9.8\ \mathrm{m/s^2}\quad(\text{静止时})

设备一旦转动,重力方向的变化必须与陀螺仪角速度的积分完全一致——因为二者在数学上是同一个旋转方程的两面:

q˙=12qω\dot{\mathbf{q}} = \tfrac{1}{2}\,\mathbf{q}\otimes\boldsymbol{\omega}

对陀螺仪读数积分得到姿态变化,再用它旋转重力向量,结果必须与加速度计实测的重力方向吻合。磁力计则要落在地磁场强度范围内(约 25–65 μT),方向随设备旋转联动。

物理因果枷锁:断一条链即穿加速度计‖a‖≈9.8陀螺仪∫ω → 姿态磁力计25–65 μT触摸落屏→脉冲旋转必联动激起微脉冲加速度在变而陀螺静止、或触摸发生而加速度平静 = 因果断裂

还有更细的一层——噪声的质地。真实 MEMS 传感器的噪声不是纯高斯白噪声,而含 1/f1/f 的粉红噪声成分;真人手持有 8–12 Hz 的生理性震颤;走动时加速度是带足跟冲击的非正弦周期信号。一段「太干净」的白噪声,或者干脆平坦的读数,在频谱分析下立刻现形。

时间维度上还有最后一道锁:所有这些信号流必须挂在同一个单调时钟上。触摸事件、传感器采样、脚本计时若来自不同时钟,跳秒或漂移会让它们对不齐——又一处不自洽。


四、不可压缩的人类:反应时间与逐帧统计矩

Section titled “四、不可压缩的人类:反应时间与逐帧统计矩”

第三级台阶还有一类特殊约束:它们不是分布,而是硬下界——源于人类神经与运动系统的物理极限。

人做任何一个纠正动作,都要经历一条不可跳过的链:察觉(认知处理)→ 决定视觉搜索(找到目标)→ 运动准备并执行。每一步都要时间,量级在数百毫秒。以打字修正为例,从发现打错到找到退格键、按下、再把注意力切回——这条链的每一环都有生理下界。甚至连续退格也逃不掉:系统的按键重复率有一个物理下限,快过它就是人类手指做不到的速度。

于是脚本陷入两难:要么跳过这些延迟(在时间上做出人类来不及的操作,最干脆的破绽),要么精确复现每一处(而它们随情境连续变化、彼此依赖,极难穷举)。真正打字飞快的人,不是省掉了这些延迟,而是把它们并行化、预测化了——但每一步的下界仍在。把「快」实现成「省掉反应时间」,方向根本就错了。

真人击键间隔的分布本身也是一处签名:它是右偏的对数正态(天然非负、带一条长尾),而非正态或均匀。

t间隔Lognormal(μ,σ)t_{\text{间隔}} \sim \mathrm{Lognormal}(\mu,\sigma)

为什么必须逐帧,而不能看快照

Section titled “为什么必须逐帧,而不能看快照”

这引出人机识别里一条极重要的方法论:不能用瞬时值分类,必须用逐帧的统计矩。

原因是双向的。检测方若用单帧快照(比如触摸落下那一帧的峰值压力)来判断,会误伤真机的极端帧;所以严肃的检测转而刻画「整个过程如何演化」。而这恰好堵死了粗糙伪造——只对齐了均值或首帧的伪造,会在更高阶的统计量上原形毕露:

统计量刻画什么伪造难度
一阶(均值)中心位置低,容易对齐
二阶(方差)离散程度
三阶(偏度)不对称性(如早峰衰减的右偏)
四阶(峰度)尖锐/厚尾
自相关 ρ(τ)\rho(\tau)时间上的「记忆」很高——真实过程有结构,白噪声≈0
包络形状生成过程的动力学极高——由生物力学决定,几乎不可调

真实行为的信息,藏在过程的动态里,不在任何单帧的快照里。 能对上一个点,对不上整条曲线的形状与它的高阶矩、自相关结构。


五、执行环境:自动化的自我暴露

Section titled “五、执行环境:自动化的自我暴露”

前两节看的是「行为像不像真人」。还有一整条正交的战线:这个执行环境本身,是不是被程序驱动的?

自动化框架会在浏览器里留下痕迹:标准的自动化标志位、被激活的调试协议域、注入脚本所在的隔离执行上下文与主世界之间的差异(例如跨上下文通信的往返延迟、可被计时侧信道探到)、乃至 JIT 引擎的去优化足迹。更深的一层是环境指纹:软件光栅渲染栈与真实 GPU 的 WebGL 特征不同、品牌字体的字宽差异、以及——一个声称是手机的环境却报告零触摸点、无运动传感器,本身就是矛盾。

但最优雅的原理,是观察者无法不留下痕迹

还有一道跨层一致性的锁:一个实体在网络层声称的身份(TLS 握手参数的顺序构成的浏览器指纹)、地理位置(出口 IP 的归属)、时区、语言,必须彼此自洽。声称是某浏览器、TLS 指纹却对不上;IP 在一国、时区却是另一国——任何一处跨层矛盾,都是破绽。


六、为什么这是防御方占优的博弈

Section titled “六、为什么这是防御方占优的博弈”

把五节收拢,就看清了那个开篇命题为什么成立。要伪造一个「像真人」的实体,攻方必须同时

  1. 每一维的边缘分布都像(第一级台阶);
  2. 让维度之间的联合/相关结构都对(第二级);
  3. 让所有由物理定律耦合的维度因果自洽——断一条链即穿(第三级);
  4. 不违反任何不可压缩的人类下界(反应时间、按键极限);
  5. 执行环境不因自动化而自我暴露(侧信道、跨层一致性)。

这是一个跨越统计、物理、网络、环境多个层面的连乘约束——维度诅咒(第一节那张图)把它压向零。而防御方只需在其中任意一处逮到不自洽。


尾声:每一层都能挖成一口深井

Section titled “尾声:每一层都能挖成一口深井”

本篇是「识别与对抗」的全景图;它标出的每一层,本身都是一个可以挖到底的深井:

  • 浏览器指纹这一维,可以深入到信息论——一个指纹到底携带多少比特可识别信息、可识别性的理论上界由什么决定、Canvas/WebGL 的差异如何确定性地追溯到 GPU、驱动、字体栈。
  • 网络与协议指纹这一维,可以深入到 TLS 握手、HTTP/2 帧结构、协议栈实现差异的识别原理。
  • 行为生物特征这一维,可以把第三、四节的物理自洽与统计矩,展开成完整的建模方法。

这些是本部后续要逐一展开的主题。而研究它们之前,先要跨过一道方法论的坎——如何在度量这些黑盒时不被自己的错觉欺骗:如何度量一个黑盒。那里讲的因果纪律,是啃动本篇每一口深井的前提。


人机之辨不是查名单,而是判别待检实体的行为分布 QQ 与真人分布 PP 的可区分性;维度诅咒让这场博弈结构性地偏向防御方(攻方须每维都像=连乘,守方只需一维露馅)。伪造难度是三级台阶——边缘分布(可逐维调像)、联合结构(须联合复现)、物理因果耦合(断一条链即穿,无调参空间)。第三级最锋利:触摸的生物力学、传感器的物理守恒,逼着伪造去复现整个物理世界;再加上不可压缩的人类下界(反应时间、逐帧统计矩戳破首帧伪造)与执行环境的自我暴露(观察者无法不留痕、跨层必须一致),共同把攻方推向一个几乎不可能全部满足的连乘约束。占优不等于必胜——误杀成本仍留了缝隙——但维度只增、物理越挖越深,趋势明确站在防御一边。