文章目录
- [1. 写在前面](#1. 写在前面)
- [2. 指纹检测](#2. 指纹检测)
- [3. 行为验证](#3. 行为验证)
- [3. 加固防护](#3. 加固防护)
- [4. 链路检测](#4. 链路检测)
- [5. 风控埋点](#5. 风控埋点)
- [6. 游客注册](#6. 游客注册)
- [7. 数据防护](#7. 数据防护)
- [8. 账号权重](#8. 账号权重)
- [9. 反调阻断](#9. 反调阻断)
【🏠作者主页】:吴秋霖
【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python与爬虫领域研究与开发工作!
【🌟作者推荐】:对爬虫领域以及JS逆向分析感兴趣的朋友可以关注《爬虫JS逆向实战》《深耕爬虫领域》
未来作者会持续更新所用到、学到、看到的技术知识!包括但不限于:各类验证码突防、爬虫APP与JS逆向分析、RPA自动化、分布式爬虫、Python领域等相关文章
作者声明:文章仅供学习交流与参考!严禁用于任何商业与非法用途!否则由此产生的一切后果均与作者无关!如有侵权,请联系作者本人进行删除!
1. 写在前面

在数字经济蓬勃发展的新时代,数据已成为推动社会进步的核心战略资源,其范畴涵盖个人信息、商业机密、政府敏感数据等关键领域。随着云计算、大数据、人工智能等前沿技术的深度应用,数据资产的价值呈现指数级增长,与此同时,数据安全风险也日益凸显,对安全防护体系建设提出了更高要求
2. 指纹检测
现在很多网站都会通过集成第三方设备指纹(如数美、顶像、京东的风控SDK)或自研系统,从客户端设备和浏览器环境多维度收集特征值,生成唯一指纹后联动业务风控系统,对后续请求进行动态风险评分。一旦标记为爬虫行为,就会采取封IP、设备或浏览器、限制页面加载、API访问权限,甚至弹验证码、强制账号下线等反制措施
而对抗这种防护的核心,就是伪造可信的设备身份。具体来说,可以通过改机工具、使用魔改或指纹浏览器,以及编写JS注入来擦除特征、篡改指纹等方式,伪造出新的设备及浏览器环境。通过这些手段,能够批量生产出大量干净的设备指纹信息,为爬虫持续抓取数据提供支持,不过不同厂商的防护强度不同,突破难度也有差异
市面上很多网站会把TLS
握手特征和JA3
指纹的检测交给CDN(如 Cloudflare
、Akamai
等其他盾)处理,利用CDN对已知爬虫框架、第三方模块发出的流量进行初步筛选过滤,实现精准识别与拦截
可以根据网站检测的TLS
版本(1.2/1.3
),预定义真实浏览器的 TLS 模板,让请求与真实浏览器高度一致;也可以收集不同浏览器真实的指纹信息形成指纹库,在此基础上进行微调。总体来说,此类防护的绕过难度较低
python
message FingerprintPacket {
string session_id = 1;
string device_id = 2;
int64 ts = 3;
repeated KeyValue features = 4;
bytes canvas_hash = 5;
bytes webgl_hash = 6;
}
3. 行为验证
不少网站会采购第三方行为验证码防护方案(如极验三代、四代,顶像、数美、易盾,阿里腾讯系)或自研验证码系统,与业务风控联动,对客户端访问、请求进行风险拦截,阻断爬虫请求
行为验证码的突防可以采用自动化和接口协议两种破解方式。两种方式的共同难点主要在图片识别上,这时候可以对接第三方接码平台。对于滑块缺口、单旋转拼图,都可以用OpenCV
来识别距离(还会结合轨迹|行为|指纹来实现动态防护
)
其他类型如空间推理、点选验证等,则需要进行模型训练。自动化方式还需要解决轨迹拖动特征处理,可以使用经典贝塞尔曲线,再在过程中随机插值,防止被Bot
检测到。接口协议方式的难点主要集中在图片还原(图片乱序或在JS层面有还原逻辑)、接口参数加密、轨迹加密等,其绕过难度不一
绝大部分网站会对核心业务接口进行防护,通过对接口请求参数动态化加密、参数签名,来抵御请求重放、伪造、篡改
对抗的核心在于逆向分析还原加密与签名逻辑,或者跳过加密验签环节。采用跳过加密验签的方式时,首先要找到加密入口,往浏览器原生JS中注入WS
服务代码,采用RPC
调用的方式拿到加密参数值,提供给爬虫抓取使用。另一种逆向还原加密的方式,是找到调用的核心加密代码,梳理出参与加密的入参和使用的加密算法后进行还原,再联动爬虫提供验签、加密服务,以此伪造请求抓取数据,这种方式的绕过难度也不一致。
某些重点API会集成第三方的WAF
服务,通过动态验证机制对访问请求进行合法性校验,要求客户端完成特定交互验证,通过后服务端会生成带有时效性的密文凭证
突防的核心在于模拟完整验证流程拿到有效凭证。可以通过抓包分析WAF
的验证链路,梳理从初始请求到最终获取凭证的完整API交互流程,在这个过程中拿到服务端下发的多个关键参数信息。最后,在提交验证的接口(一般有加密验签)中,通过逆向手段还原加密算法,提交验证拿到凭证信息。每一次都走这套流程,就能确保WAF
认证的凭证永远在有效期内,实现持续抓取,其绕过难度不一
3. 加固防护
这种防护适用于核心参数加密、请求加签等任何需要逆向的场景。在 Web 端,会采用禁用控制台调试、无限 Debugger、核心代码混淆、VM 化、Webpack 异步且核心防护代码具备动态更新和自动混淆能力等手段。除此之外,还会通过核心代码下沉、将核心加密放到 WebAssembly 中,迫使作弊、爬虫方逆向混淆后的汇编代码,提升逆向难度。
对抗的核心是从层层防护下破解还原出加密算法。爬虫仍然可以采用自动化、RPC 的方案进行数据抓取。破解加密签名参数还可以使用补环境、纯算法还原两种方式。首先都需要解决反调试问题,其次可以选择对混淆的代码进行 AST 解混淆以便后续分析;涉及 VMP 的话,还需要投入大量时间进行日志插桩分析,反推并还原加密算法;补环境则只需要将 VMP 代码扣出来,将加密入口暴露导出,再补全环境即可
4. 链路检测
链路检测
是什么?可能很多小伙伴没有听说过。这里我们可以把它理解为本次的请求是否遵循了网站预期的访问路径
(也就是从入口到中间再到最终目前页面的完整的上下文
)目的则是防止爬虫或滥用者通过直接构造请求去绕过前置页面、跳过业务交互或触发关键行为(链路检测是行为真实性验证的重要环节
)
导航的路径上下文是需要满足短时态
、不可伪造
、轻量可审计
的。下面是一个schema
的规则示例:
python
{
"session_id": "sid_abc123",
"entry_page": "/category/42",
"entry_ts": 1690000000,
"events": [
{"type":"resource_load","name":"init.js","ts":1690000001,"hash":"sha256:..."},
{"type":"xhr","endpoint":"/api/list","ts":1690000003,"status":200},
{"type":"interaction","kind":"click","target":"item_987","ts":1690000005}
],
"target_page": "/product/987",
"nonce": "n_456",
"expires": 1690000025
}
一些站点会通过链路检测机制,对客户端请求的访问路径进行全程追踪与校验,防范某些场景下爬虫直接通过资源 ID(用户 ID、商品 ID、订单编号等)跳过前置页面,直接访问请求详情页扫描的行为
对抗的核心可以考虑从完整的链路模拟触发,构建出合法的链路上下文轨迹
5. 风控埋点
做安全防护跟逆向分析的都知道埋点
,可以给不知道的小伙伴普及一下。风控埋点
= 客户端(Web|APP|Native
)在请求链路中所附带且用于表征客户端环境或行为的隐含
或显式
字段
它的目标可以是构建客户端的fingerprint
也可以是验证会话与交互的链路
还可以是采集行为的特征
以及提供恶意客户端
识别的输入给到风控引擎
一般设定埋在位置包括不限于: HTTP的请求头内
、CK
、WS消息
、二进制协议
、原生的RPC或HTTPS请求内
...
按照类别来分的话常见的一些埋点包括了如下所示:
- 静态类的:
UA
、分辨率|时区|平台内核的那些信息
通常都是很基础但又必要的一些东西,组合起来就能构成强指纹 - 环境指纹类的:
Canvas|WebGL|音频|字体|插件等等指纹
、在APP端等价设备ID
、厂商|型号|ABI|传感器等等
- 行为类的:
鼠标的轨迹
、滚动与触摸的节奏
、焦点切换与停留时间
、交叉的页面路径
自动化或者脚本往往过于规则化
还有那种埋点的ID
跟链路事件,比如我们经常会看到在一些页面请求中,有*_id
之类的行为序列
,将用于重构会话的路径与异常检测
对抗核心逻辑尽量去模拟出真实客户端完整的执行流程、以及所有可疑的参数防止因埋点参数检测带来的风控(单纯的完成验签与部分伪造不足以绕过一个高质量的风控
)
这个过程是耗时且持续性的,需要不断的分析跟测试最终根据大量的测试数据找到最优
方案
6. 游客注册
目前很多网站为了降低访问门槛、提升用户体验,会开放游客权限机制。用户无需注册登录账号,仅通过访问网站即可自动获得临时游客身份的Token
或Session
这个就很容易被滥用
,尤其是被爬虫或自动化工具批量获取身份,用于数据抓取、刷单、恶意请求等
但是这类游客身份通常都是有时效性跟某些限制的(重点接口无法访问
)然后也会有一些防护措施,不过一般都不会太难!无非就是限速
单一IP或者设备在某时间段内无法生成太多游客(做了指纹的唯一绑定
)不规避的话就是异常|频繁|封设备
或风控验证
,以及适当的加一个验签
对抗的核心测试需要干净切真实的环境或设备
7. 数据防护
在电商、GOV、影视、本地生活
相关客户端中,为了保护业务数据防止自动化抓取跟协议爬取,平台通常会对接口响应的数据进行多层加密和混淆,防护的策略通常包括前端解密渲染
、字体/样式加密
以及其他不可见的字符映射
等手段对明文数据进行防护
常见的一下数据防护手段如下所示:
- 接口响应加密: 服务端将原始数据加密后返回客户端,客户端通过
JS
或Native
端的解密后渲染到页面(常见的加密手段: AES-CBC|GCM
、RSA
、HMAC|SM3
、WASM
...) - 前端渲染加密:
JS
在页面前端完成解密逻辑并渲染,来阻止单纯抓HTML明文数据 - 字体映射与样式混淆: 使用
SFNT|SVG
字体映射或CSS
偏移将明文字符替换成编码码点或特殊字符,在页面渲染时再通过字体或样式将码点显示成正确字符(抓到一堆乱码
)
对抗核心则是接口返回的密文分析调试源代码找到解密算法|密钥信息
即可还原明文,如果是字体|CSS
加密等方式,需要找到字体文件并下载,再分析编码规则(一般汉字相关的都会通过Unicode
码点去文件找对应汉字)或使用OCR
通用方案识别对字体文件中的文字进行还原
实现原理与流程是:先创建一个白色的背景图像,再使用ImageDraw
在图像上重新绘制出字符,将图像转为RGB
格式,最后使用OCR
进行识别得到一个关系表。爬虫通过抓取到的原始数据,通过码点去表里面检索,还原被加密的字符,补全并还原出完整的明文数据
8. 账号权重
目前很多社交媒体,如国外的Meta还有国内的某书某些数据接口都是对账号有着严格的权重校验。新注册或者高危的账号都是无法正常请求访问
账号权限重是一套基于历史行为、认证级别、社交关系、设备和环境等多维特征,为每个账号分配的"可信度分"
。平台用它决定账号请求的敏感度
新|高风险账号(高频异常IP、托管的邮箱、异常的设备指纹、脏了的手机号段(一般第三方的那种接码 )这些基本默认就是低权重甚至是灰名单
(使用的过程中会出现生物验证
或强制下线
)
一般会通过多个维度的数据来计算权重
:
- 比如注册的来源或者说渠道: 是否那种虚拟号、第三方、注册的时间跟速度(
批量的特征|这里不讨论底层协议或参数
) - 比如持续的一个活跃度:
日
/周
/月
的登录次数,会话的长度跟交互的深度(说白了就是有没有互动的痕迹,这个在以前做Meta的时候深有体会
) - 该账号的社交图谱: 这个听起来是不是有点抽象,这个还真是校验权重的一个重点标准!该账号的好友、粉丝、关注这些质量。都是可以做画像的,一些不合规的业务(
一关联一个准
) - 设备跟地域跨度: 设备的唯一ID、浏览器的指纹。IP地址的轨迹路径(某些社交媒体基于这些触发一系列的风控验证,如
KYC认证以及认证的方式
)
基于上面多维度收集的数据后面就是风控系统工程化
的实际操作了,如何去设计权重的分数、如何分配标签、阈值的判定都是触发策略链
的关键,包括实时在线决策
跟离线标记
的这种方案设计
9. 反调阻断
不管是APP还是Web业务中,大部分平台不仅对源码进行了保护还对逆向分析的调试过程做了防护,以此来增加逆向分析的调试成本跟难度
比如下面常见的一些手段:
- 调试的检测: 检测调试器、断点、动态调试的工具、模拟器的特征
- 完整性的一个校验: 运行时的堆栈或重要的函数是否被Hook
- 蜜罐的放置: 在逆向分析的路径植入蜜罐以此放分析者浪费大量精力
- 环境的检测: 检测沙箱、模拟器、越狱/Root环境
目前大部分的厂商或者平台对一些重点接口跟数据页面不光有一次行为验证,还有二次甚至是更多次的验证与不同策略的组合验证,常见的验证类型:
- 在线行为验证: 多种验证码交叉弹出
- 设备环境验证: 要求重新校验设备指纹、发起设备指纹绑定、SMS二次验证
- 生物/人脸验证: 针对高风险(
跟账号权重可以捆绑
)操作进行强认证
一般它的触发策略也是分级的,比如低、中、高
风险所触发的验证场景也都不一样。基于各种事件触发(埋点被触发
、蜜罐被点亮了
、异地登录
),当然任何的风控系统跟设定的策略目前都是会存在误杀
率的!平台会对可疑但不确定
的流量进行深度检测(比如说更深度的埋点试探
、放探针
)收集更多的叠加信息再决策
还有链式验证这个在之前的国外很多平台第一次验证或者前几次都失败的话就会触发更高级别的验证(
逐步升级
)比如最经典的点选会从6到9再到12再到18格
目前从服务端的角度来讲都是可以组合的验证模块(可插拔式的组件
)风控引擎将会按照设定的策略来组合调用
当然,现在平台也是会考虑到用户的。比如一些权重高又或者换一种方式价值高
的用户(这里跟上面的权重
还是有联动的)它会提供快速的恢复甚至是不予验证(也就是部分
用户的友好化
)来减少用户的流失或投诉
总之归根结底,叠加验证往往更大的重心放在防护恶意请求、反作弊对象中。最终都是结合风控系统来实施的