电商大促的流量峰值,对技术团队来说从来不是惊喜,而是压力测试。当每秒数十万甚至上百万的并发请求涌入,真正致命的往往不是带宽被占满,而是那些伪装成正常用户的CC攻击。这类攻击通过模拟真实浏览行为,请求动态页面、搜索接口或下单路径,直接耗尽后端数据库连接池和应用服务器线程。传统的频率限制和验证码之所以失效,是因为攻击工具已经能完美模拟单IP的低频访问、携带合法Cookie、解析并执行JavaScript。要守住大促的转化率,必须把防御重心从“他是谁”转移到“他在做什么”。

行为基线:从正常流量里提取不可伪造的特征

行为分析的核心逻辑是:攻击程序可以模仿单次请求的所有参数,但无法在长时间窗口内复现人类的浏览惯性。真正有效的做法不是给请求打分,而是先建立业务场景下的正常行为基线。在大促场景下,这个基线需要覆盖三个维度:页面跳转图谱、操作时间节奏、鼠标与触控轨迹。

页面跳转图谱指的是用户在站内的访问路径顺序。正常用户从广告落地页进入后,通常会经过商品详情、评价翻页、加购、凑单、结算这一系列有逻辑的跳转。攻击流量为了消耗资源,往往直接命中搜索接口、库存查询接口或大流量商品详情页,跳转关系是断裂的。把全站URL抽象成节点,统计相邻请求的转移概率,就能识别出那些不符合马尔可夫链预测的异常序列。具体实现上,可以用Redis的有序集合记录每个会话最近N次请求的页面类型,计算转移概率矩阵。当某个会话连续出现低概率跳转,比如从首页直接跳到支付回调接口,或者反复在搜索和详情页之间无规律振荡,就触发行为分扣减。

操作时间节奏比跳转图谱更难伪造。人类浏览商品时,页面停留时长符合对数正态分布,大部分在3到15秒之间,偶尔有超过60秒的深思熟虑。攻击脚本为了最大化攻击效率,请求间隔往往是固定毫秒级延迟,或者在极短时间窗口内集中爆发。提取每个会话相邻请求的时间间隔,计算其变异系数,正常用户的变异系数通常大于0.5,而脚本流量的变异系数趋近于0。另一个关键指标是长停顿后的行为恢复模式。真实用户接电话或切换标签页回来后,会有一个明显的“回神”动作,比如向上滚动页面重新定位阅读位置,而脚本从不停顿,或者停顿后直接发起下一个精准请求,中间缺失了视觉重新定位的过渡操作。

鼠标与触控轨迹在移动端尤其关键。触屏设备的touchmove事件包含加速度和方向角,人类手指在屏幕上滑动时,加速度曲线是平滑连续的,方向角变化有自然的圆弧过渡。脚本生成的触控事件要么缺失移动轨迹直接触发点击,要么是匀速直线运动。在前端埋点采集这些行为数据时,不能只记录坐标点,需要把时间戳、加速度、接触面积一起上报。大促期间移动端流量占比超过85%,这个维度的数据量巨大,但也是区分人机最精准的信号。

实时决策引擎:从采集到拦截的毫秒级闭环

行为分析如果依赖离线计算,在大促场景下毫无意义。必须构建一个实时决策引擎,在请求到达业务服务器之前完成行为判定。架构上分三层:边缘采集层、流式计算层、策略执行层。

边缘采集层部署在CDN节点或反向代理上,负责从每个请求中提取行为指纹。除了常规的UA、Referer、Cookie外,还需要注入一段极轻量的JavaScript探针,采集页面可见性状态、requestAnimationFrame帧率、WebGL渲染指纹。这些数据编码后通过自定义请求头或者Beacon API回传,不能影响主请求的响应时间。采集层本身不做决策,只负责把行为数据追加到请求上下文中,转发给流式计算层。

流式计算层是整个系统的中枢。基于Apache Flink或者自研的事件流处理框架,把每个会话的行为序列维护在内存状态中。当新事件到达时,更新该会话的特征向量,包括跳转概率得分、间隔变异系数、轨迹真实性评分、设备环境一致性等十几个维度。这些维度通过一个轻量级梯度提升树模型映射成最终的风险分值。模型需要提前用大促前的正常流量和历次攻击样本训练好,但大促当天必须支持在线增量学习,因为攻击手法在变,正常用户的浏览模式也会因为秒杀、红包等玩法发生偏移。风险分值的计算延迟必须控制在10毫秒以内,否则叠加到后端响应时间上会直接影响用户体验。

策略执行层根据风险分值做差异化处置。不是简单的通过或拦截二元决策,而是分档处理。低风险请求直接放行,中风险请求进入观察队列,返回内容正常但会注入更重的行为验证脚本,高风险请求则返回302重定向到静态缓存页面,或者要求滑动验证。关键的一点是,策略执行层需要和业务限流联动。当某个商品详情页的整体请求量超过数据库承载上限时,即使请求本身风险分不高,也要根据分值排序优先拦截低分请求,确保高分真实用户的访问不受影响。这种“业务感知的渐进式拦截”比一刀切的阈值策略更适配大促的弹性流量特征。

对抗升级:绕过行为分析的常见手法与反制

攻击者也在进化。现在主流的CC攻击工具已经具备浏览器自动化框架的完整能力,能通过Puppeteer或Playwright驱动真实浏览器内核发起请求。这类攻击的跳转路径和停留时间都与真人高度相似,单纯的行为基线检测会失效。

针对浏览器自动化攻击,第一个反制点是检测浏览器运行环境的真实性。自动化框架虽然使用完整内核,但会在navigator.webdriver属性、chrome.runtime对象、默认插件列表等细节上暴露痕迹。更隐蔽的检测方式是函数序列化。真实浏览器中,某些原生函数的toString()返回值带有[native code]标记且格式固定,而自动化工具注入的钩子函数会改变序列化结果。把这些检测逻辑用混淆后的JavaScript注入页面,在用户无感知的情况下完成环境指纹采集。

第二个反制点是利用人类独有的生物特征延迟。真实用户在页面加载完成后,大脑需要200到400毫秒来解析视觉信息,然后才会产生第一次交互。自动化脚本在页面DOM构建完成的瞬间就开始执行下一步操作。在关键页面上植入一个不可见的执行延迟检测,记录页面完全加载到首次有效交互的时间差,小于150毫秒的基本可以判定为程序操作。这个检测逻辑不能放在主线程阻塞渲染,需要用requestIdleCallback在浏览器空闲时异步执行。

第三个反制点是行为模式的长期一致性。攻击者可以租用大量代理IP,每个IP只发少量请求,但所有请求背后的行为模式是同一个脚本逻辑生成的。通过跨会话的行为聚类,把具有相同跳转序列模板、相同操作节奏分布的会话归并到一起,即使它们来自不同IP、不同设备指纹,也能识别出背后的自动化工具。这需要把行为特征向量存入列式数据库,用近似最近邻搜索算法做实时相似度匹配。

大促特有的行为陷阱设计

除了被动检测,主动布置行为陷阱是更高阶的防御手段。在大促的页面中嵌入对普通用户完全透明、但对爬虫和攻击脚本有强吸引力的隐藏链路。比如在HTML中放置一个display:none的超链接,href指向一个不存在的动态路径。正常用户看不到也不会点击,但自动化工具在解析页面提取所有链接时,会遍历并请求这个陷阱URL。一旦有请求命中陷阱路径,直接将该会话标记为高风险,后续所有请求进入严格验证模式。

更精细的陷阱是利用大促的业务特性。在商品列表页的底部,用与背景色相同的文字放置一个“下一页”链接,链接参数中携带一个特定的追踪标识。真实用户通过滑动或点击分页组件翻页,不会触发这个隐藏链接。而爬虫脚本在解析分页逻辑时,往往会提取页面中所有看起来像翻页的URL并依次请求。监控这个追踪标识的请求频率,能精准定位正在全量抓取商品目录的攻击源。

还有一种时间陷阱针对秒杀场景。在秒杀开始前的倒计时页面,注入一个计时器验证逻辑。正常用户盯着倒计时等待抢购,页面保持在前台,requestAnimationFrame持续以60fps左右运行。攻击脚本为了节省资源,通常会把页面切到后台或者降低帧率。检测页面可见性状态和帧率的历史记录,如果倒计时最后五秒内帧率突然从60掉到个位数,或者页面频繁切换可见性状态,说明这个会话背后大概率不是焦急等待的真实买家。

运维落地:规则配置与告警体系

行为分析系统上线后,最大的挑战不是算法精度,而是运维人员如何在大促当晚快速调整策略。必须提供一套面向业务运营人员的规则配置界面,而不是让开发去改代码。规则应该抽象成“当某个接口的风险分高于阈值且请求量超过基线N倍时,自动提升该接口的拦截等级”这样的业务语言。每条规则都要支持一键回滚,因为大促期间误杀正常用户的代价远高于漏过攻击。

告警体系同样关键。行为分析引擎本身需要被监控,包括事件采集的丢失率、流计算的延迟分位数、各风险档位的请求分布。当采集丢失率突增时,可能意味着前端探针被某些浏览器插件拦截,或者CDN节点出现故障,这时候要自动降级到基于IP频率的兜底策略,保证业务不中断。当高风险请求占比突然从5%飙升到30%时,不一定是攻击爆发,也可能是模型因为流量结构变化出现了误判,需要人工介入确认。

大促结束后,行为分析系统积累的数据是下一轮优化的宝贵资产。把所有被拦截会话的行为序列和最终的人工审核结果关联起来,标注出哪些是真正的攻击、哪些是误杀、哪些是漏过的。用这些标注数据重新训练模型,让它在下一个大促中更精准。这套闭环的持续优化机制,才是行为分析防护体系的核心竞争力,而不是某个单点的检测技巧。