CDN行为验证码是近年来防护恶意爬虫和撞库攻击的一种新思路,它把人机识别的逻辑从业务源站前移到CDN边缘节点。这样做的好处是,用户在访问静态资源或动态接口时,不需要先把行为数据回源,而是由距离自己几十毫秒内的边缘程序完成初步判定。边缘侧人机识别的核心,是在不依赖服务端会话状态的前提下,通过轻量模型与规则引擎区分真实人类与自动化脚本。

边缘侧行为采集与特征提取原理
在CDN边缘节点上,行为验证码通常不会像传统方案那样弹出一个复杂的拼图框,而是将采集脚本通过边缘函数注入到HTML页面里。这个脚本会监听用户在页面上的指针移动、点击间隔、滚动速度以及设备方向变化。由于CDN节点本身已经缓存了页面外壳,注入动作可以在响应返回给用户的最后一刻完成,不会增加源站负担。
采集到的原始行为数据会在边缘运行时中被转换成一组定长特征向量。例如,鼠标轨迹的曲率方差、触摸事件的离散程度、请求头中缺失的浏览器指纹字段,都可以作为识别依据。边缘函数受限于运行时间和内存,无法跑大型深度学习模型,因此多采用决策树或轻量梯度提升树。这些模型在编译时被序列化为几百KB的二进制,加载后能在毫秒级给出风险评分。
与中心化采集相比,边缘侧特征提取最大的差异在于上下文缺失。中心服务器可以关联一个用户过去十分钟的会话,而边缘节点往往只看到单次请求。为此,工程上会把设备指纹通过加密cookie下沉到客户端,边缘程序读取该值后结合本次行为做联合判断。这样既保护了源站,又弥补了单次观察的不足。
边缘函数与中心校验的协同架构
单纯依靠边缘节点做最终拦截并不可靠,因为边缘环境可能被绕过或模型被逆向。合理的架构是边缘负责初筛,中心负责复核。边缘函数根据风险评分给请求打标,低风险流量直接放行,高风险流量要么返回二次验证挑战,要么转发到中心风控接口。下面的伪代码展示了边缘函数如何改写响应并注入采集逻辑。
// 边缘函数示例(基于CDN边缘计算运行时)
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request));
});
async function handleRequest(req) {
// 读取客户端携带的设备指纹
const fp = req.headers.get('x-device-fp') || '';
// 调用轻量模型进行风险评分
const score = edgeRiskModel.predict(parseFeatures(req, fp));
if (score < 0.3) {
// 低风险直接回源
return fetch(req);
}
// 中高风险注入行为采集脚本
const res = await fetch(req);
const txt = await res.text();
const injected = txt.replace('</head>', '<script src="/edge-captcha.js"></script></head>');
return new Response(injected, res);
}
上述代码中,edgeRiskModel是预先部署在边缘的模型对象,parseFeatures从请求中提取基础特征。注意我们在注入脚本时转义了<head>标签名,避免与运行环境冲突。这种架构下,中心系统只需处理被边缘标记的可疑请求,源站QPS可以下降一个数量级。
协同架构还要解决状态同步问题。当边缘节点判定某设备为恶意时,应通过异步日志上报给中心,中心再下发封禁名单到边缘KV存储。由于CDN边缘分布广,名单 propagation 存在秒级延迟,工程上要接受短暂窗口内的漏过,而不是追求强一致。实践证明,这种最终一致性对验证码场景完全够用。
落地部署中的误判与隐私合规权衡
行为验证码在边缘侧运行,最容易引发争议的是误判率。真实用户如果处于弱网环境,行为轨迹会变得不规律,可能被轻量模型误伤。为降低误判,部署时通常采用分级挑战:首次可疑只要求点击一次,连续可疑才出滑块。这样正常用户最多多一次交互,而机器人若模拟不全行为链就会暴露。
隐私方面,边缘节点采集指针轨迹属于个人行为数据。虽然这些数据不出边缘、不做持久化,但仍需在隐私政策中明示。技术实现上,应将原始行为在边缘内存中即算成特征向量,不写磁盘、不上报明文。下面的表格对比了三种方案的隐私与性能表现。
| 方案 | 数据出边缘 | 源站压力 | 误判率 |
|---|---|---|---|
| 中心化验证码 | 是 | 高 | 低 |
| 纯边缘拦截 | 否 | 极低 | 中 |
| 边缘初筛+中心复核 | 仅可疑 | 低 | 低 |
从表格可以看出,边缘初筛加中心复核在各项指标上更均衡。实际项目中,建议先把边缘模型阈值调宽松,观察一周误拦日志,再逐步收紧。同时保留一个中心兜底接口,当边缘脚本加载失败时使用传统验证码,保证可用性。
最后要提醒,行为验证码不是银弹。高级机器人会利用无头浏览器的自动化框架完整模拟人类行为,此时边缘侧仅靠轨迹难以分辨。应配合IP信誉、TLS指纹等多维信号,把边缘人机识别作为纵深防御的一环,而非唯一屏障。