首页>安全>正文

电商反爬体系的分层设计与行为指纹落地实践

Feng 47 阅读 安全

电商平台的数据资产越厚,爬虫盯得越紧。头部平台一天拦下的异常请求能到百万量级,商品详情、价格、评论这三类内容是被薅得最狠的。防守方要做的不是单点封堵,而是把请求从进站到落库的每一段都布上检查点。

先看清对手的技术栈

爬虫早就不是一条 requests 循环跑到底。最底层的是模拟浏览器头部的简单抓取,往上是用代理 IP 池摊薄单 IP 频率的分布式方案,再往上是用 Headless 浏览器跑完整渲染链路的,最难缠的是拿模型去试验证码的。某国际平台公开过一组拦截样本:带动态换 IP 能力的请求接近四成,跑 Headless 的超过两成。这个比例说明,只靠 IP 频率阈值已经拦不住主力部队。

网关层是第一道闸门

最外层的过滤放在反向代理上最省事。Nginx 的 limit_req 模块能按 IP 或按 key 做令牌桶限流,配置里 burst 和 nodelay 两个参数要配合着调,否则突发流量会被整批拒掉,正常用户的首屏加载也会被误伤。需要更细的逻辑时,OpenResty 更合适——在 access_by_lua 阶段读 UA、读 Referer、比对请求头顺序,命中规则直接 ngx.exit(403),请求连上游都不进。

这里有个容易踩的坑:limit_req_zone 的 key 如果只写 $binary_remote_addr,在 CDN 回源场景下拿到的全是边缘节点 IP,限流会变成把所有用户当一个人限。正确做法是从 X-Forwarded-For 里取真实客户端地址,并且只信任自家 CDN 段的头部,否则伪造 XFF 就能绕过。

UA 校验也别做成静态黑名单。爬虫改 UA 的成本几乎为零,静态名单只能挡住最懒的那批。把 UA 和 TLS 指纹(JA3)绑在一起看更有意义——同一段 UA 字符串背后如果 TLS 握手特征频繁变化,基本可以判定是伪装。

行为指纹:从”像不像人”到”是不是同一个人”

频率和头部都能伪造,操作轨迹难伪造。采集鼠标移动的加速度曲线、点击间隔的分布、滚动步长和停顿位置,拼成一条会话级的行为序列,再用它做判定。有平台实测过,把鼠标加速度和点击间隔做成复合模型后,高级爬虫的通过率从两成多压到个位数百分比。

采集端代码大致是这个形状:

电商反爬体系的分层设计与行为指纹落地实践

function collectBehaviorData() {
 const trackData = {
 mouseMoveSpeed: calculateMovementSpeed(),
 clickInterval: getClickTimestamps(),
 scrollPattern: analyzeScrollBehavior()
 };
 return encryptData(trackData);
}

这段只是骨架,真实系统里还要处理采样率、离线上报、以及前端被 hook 篡改的对抗。指纹数据回传后进特征库,和账号、设备、IP 做关联,才能识别”换 IP 不换人”的分布式爬虫。

行为指纹不是万能药。它对无障碍访问工具天然不友好——读屏软件驱动的操作轨迹和脚本高度相似,一刀切会误伤视障用户。老旧浏览器或低端机型上采样精度差,特征噪声大,判定阈值要单独放宽。另外按个人信息保护法的最小必要原则,采集轨迹类数据得有明确告知和授权基础,否则风控系统本身就成了合规风险点。这几类场景下,行为指纹更适合做加权信号而非一票否决。

会话级加密与令牌

传输层的 HTTPS 只解决链路窃听,解决不了接口被直接调用。会话建立时下发一次性密钥,每个请求带时间戳和签名,服务端校验时间窗(通常 30 到 60 秒)并拒绝重复 nonce,重放攻击就失效了。某跨境平台上了这套之后,接口数据外泄事件明显下降。要点是密钥轮换周期别设太长,签名算法用 HMAC-SHA256 这类成熟方案即可,别自己发明。

模型识别与持续迭代

规则挡不住的,交给模型。LSTM 一类序列模型适合吃行为序列,输出异常概率。有平台报过九成以上的识别准确率和千分之几的误判率,这个量级在风控里算可用,但前提是特征工程做得扎实、标注样本干净。模型要定期用新样本重训,否则爬虫换一代手法,准确率就往下掉。线上部署时建议模型分和规则分做融合,单靠模型容易在流量突变时抖动。

规则上线后怎么验证

防护策略配完不等于生效。验证限流最直接的办法是写脚本按固定节奏打请求:比如 1 秒内发 20 个请求,预期前 N 个返回 200、其余返回 429,跑完统计响应码分布,和配置的 rate 与 burst 对上才算通过。UA 拦截则构造几组已知的爬虫 UA 和正常浏览器 UA 分别请求,检查前者 403、后者 200。行为指纹的验证更麻烦,需要录制真实用户操作回放和脚本回放两组样本,看判定结果的分离度。每次规则变更都跑一遍这套回归,能避免改一个参数把整条链路打挂。

处置要分级,别一棍子打死

识别出疑似爬虫后,直接封 IP 是最糙的做法。更稳的是渐进式处置:先降速、再弹验证、再限接口、最后才封禁。这样即使误判,正常用户也只是多一次验证,不至于直接访问不了。分级策略同时缓解了合规压力——数据安全法要求运营者采取技术措施保障数据安全,但处置手段的强度要和风险等级匹配,过度拦截同样会引发投诉。

反爬是持续对抗,没有一劳永逸的配置。技术侧管拦截,运营侧管策略调优和误伤申诉,法务侧管采集边界和数据合规,三条线得一起转。定期做渗透测试,拿自己的防护体系当靶子打一遍,比任何纸面方案都管用。

ID:6707

Feng
这位作者很神秘,还没有填写简介。