【抖音滑动验证码风控分析】
一、风控头部信息差异
-
正常响应头部信息
{"Server": "Tengine","Content-Type": "application/json; charset=utf-8","Transfer-Encoding": "chunked","Connection": "keep-alive","Date": "Mon, 14 Jul 2025 05:05:39 GMT","Vary": "Accept-Encoding","X-Tt-Logid": "202507141305397D30841E2EB14B000F68","Status_code": "0","Bd-Tt-Error-Code": "0","Tt_stable": "1","To-Env": "","X-Ms-Token": "z0mRA3r_PeJgyl-wsGWCfDVuz3p_kksDHt2LqMtuXc_jgIU1H27EGGP_LwNN6NYVvJqhx82G7iAcM59CQiPbVsW905IC3XYBn0v_wib4","Cookie_ttwidinfo_webid": "","X-Janus-Info": "fu-GCo9HiuEKJ7lY9HXV9IBsq01Qd4lvOzaNL_U73YrkhiUz0Ks2C7cXqy837Av4ftY0cSjjdyTjsBKM278HeKfI-g0PJOGzk2GTmfzjD6ulXN6KO47MhAtFrA-MLBWQLy4eG3bn1pM_c9HWqJff2uE6b6AJTM8HCjJUhrl-8UfF0UFxZc4BK62zRQUnizEb0v_nzm8hzkunjDnVvlvlc1TV4EwWDC-73fbT_0sE7zn539o-QLtELKYZcODgc7F44jrl97MaLqd_30m3_jRwPh9dWmLOMHNUDOzngg==","Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload","Access-Control-Allow-Credentials": "true","server-timing": "inner; dur=354, cdn-cache;desc=MISS,edge;dur=0,origin;dur=389","x-tt-trace-host": "01c58805113646741ba36b2f429e68793a5be009fac63f8b6c183e138ed8dcc2c572a2010b3ed54f67849d01534093f0c1ca0860622e9b0ebfe69f0e36c7bfad4ff4cccd62b908c91ee7cee429e2f5b46398f1e740f436f0c30a296fab697754ec","x-tt-trace-tag": "id=03;cdn-cache=miss;type=dyn","x-tt-trace-id": "00-2507141305397D30841E2EB14B000F68-2382579563F8BB27-00","Content-Encoding": "br","Via": "live1.cn3775[389,0]","Timing-Allow-Origin": "*","EagleId": "65e21aae17524695394808125e" }
-
验证码风控响应头部信息
{"Server": "Tengine","Content-Type": "text/plain; charset=utf-8","Content-Length": "0","Connection": "keep-alive","Date": "Mon, 14 Jul 2025 05:09:08 GMT","Tt_stable": "1","X-Ms-Token": "oTPvukRVs8zOXq9PDRXjhh2tIf7Tu850bEay6brmdcK60OdxBNGTDo9854Xnqe02aAHCswFePiY8r2x9IEI_CsZ5GxvGndWO3EYAdU-P","X-Vc-Bdturing-Parameters": "eyJjb2RlIjoiMTAwMDAiLCJmcm9tIjoiIiwidHlwZSI6InZlcmlmeSIsInZlcnNpb24iOiIiLCJyZWdpb24iOiJjbiIsInN1YnR5cGUiOiJzbGlkZSIsInVpX3R5cGUiOiIiLCJkZXRhaWwiOiJ1RWRqcmVXdWNxZ2VtWXRvdVJiOFM3Qk9sbktxNmVidjRucFhLc1oqMUpwWkFvcnpPdGFMVWlqRklMQzhoN3lISVFsdXhuTmNvY09ieFpnaFN6VGNHM3E2KnJ1QUVud0VETldVVXBOLTNsTk50VUxBeThYQXpmN282S1JOd2x4bzJlN1ZOd3BnU3paeTVzM2VvYTdCbGRxeGR0bzhHVkR3VnY3Zlp5RUlIdEVqSW45OWR1VkUqMlhLLTdpbUpOYno2aktQaFZLQUVmSFozUUJiTU5WV2cta1ZMY0NtM3ZEKlFXM3ZyaVJlVzNiOURFYXhiLWc5RVR6R1ZGWTlEalktV3pwTUVTd3dKdEg5aXRlRFgzU3N0UGI5eDY4YSpZYWJnSzZ3cENCZktPbm04aEZjWC1sS25nZWdIVlU3a29jSmZtLTY5YU1nNmYwSEtRTUJmWUFLKmtMNFJiQkJRQW5MeDl4TDBGeFgxTndCUGhOQnFsYk9hc0sqdmF4cU5FbElsVC1mS3FuQndCbkNtdEFoZipnaHNIVDR5V1dBUncuLiIsInZlcmlmeV9ldmVudCI6IjYxMjQiLCJmcCI6InZlcmlmeV9tZDJuOG8xeV90ZTJ3S1R2T18zaEhXXzQ0Mk9fQllDMl9vUWNFR20yY3RuOEkiLCJzZXJ2ZXJfc2RrX2VudiI6IntcImlkY1wiOlwiaGxcIixcInJlZ2lvblwiOlwiQ05cIixcInNlcnZlcl90eXBlXCI6XCJ3aGFsZVwifSIsImxvZ19pZCI6IjIwMjUwNzE0MTMwOTA4RDkxQTRGQjM0QjMyNzQzNzJFMDQiLCJpc19hc3Npc3RfbW9iaWxlIjpmYWxzZSwiaXNfY29tcGxleF9zbXMiOmZhbHNlLCJpZGVudGl0eV9hY3Rpb24iOiIiLCJpZGVudGl0eV9zY2VuZSI6IiIsImxvZ2luX3N0YXR1cyI6MCwiYWlkIjowfQ==","Access-Control-Expose-Headers": "x-vc-bdturing-parameters,bdturing-verify","X-Janus-Info": "em9oj7Q2q8vvQ1uAwI1r2t08-1NBxINjzAzQHpZzRFxd0pwar4x2AYwgRxCE1Fn_R4hrg6U_TqaycTOjExighVnRSrzgWvZQARvw0Ak3fVqUo8ANgsYGl9frHmdYsi5FLrdK3y_24-yvkZRQNaSj49eisbxEHJPtSTlW0N7qhpCWREaTABkAdSN6uS-cB6zawtRGYbxgdxyWjjAz6vN4Uhwd4sBkopYp52XL-7UHUHa8ym2qBTPcrZf7amkcwhgQuU4I_EMippHDQe-iSlHGks4KIw_z0PwZf1wPpA==","X-Tt-Logid": "20250714130908D91A4FB34B3274372E04","Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload","Access-Control-Allow-Credentials": "true","server-timing": "inner; dur=87, cdn-cache;desc=MISS,edge;dur=0,origin;dur=124","x-tt-trace-host": "01c58805113646741ba36b2f429e68793a575d007d5f848f183fee10f53debeb0ed681ba2cf823ffef3df11b3547088156381d9a7c626a2ecfda2137eab1b63f429d70d2d30d2c48190778aad96db0efab73c5aa58346e352ade0b2c4b93d566c0","x-tt-trace-tag": "id=03;cdn-cache=miss;type=dyn","x-tt-trace-id": "00-250714130908D91A4FB34B3274372E04-3053C2B282FDA15A-00","Via": "live4.cn3775[124,0]","Timing-Allow-Origin": "*","EagleId": "65e21ab117524697484014455e" }
通过对比两个响应头信息,可以发现验证码风控场景与正常数据返回场景在响应头参数上存在显著差异,这些差异主要体现在风控标识、内容类型、数据传输方式等方面
二、关键参数含义及差异解释
1. 内容类型与数据传输方式
-
正常响应:
"Content-Type": "application/json; charset=utf-8"
"Transfer-Encoding": "chunked"
application/json
:表示服务器返回的是 JSON 格式的业务数据(如接口返回的具体内容),客户端可直接解析处理。Transfer-Encoding
:用于动态生成的内容(如数据长度不确定时),采用分块传输方式,无需提前指定Content-Length
。
-
风控响应:
"Content-Type": "text/plain; charset=utf-8"
"Content-Length": "0"
text/plain
:表示返回的是纯文本格式,但实际Content-Length: 0
说明无任何业务数据,仅通过响应头传递风控信息。Content-Length: 0
:明确标识响应体为空,客户端无法获取正常业务数据,需处理风控逻辑(如验证码验证)。
2.风控核心参数:X-Vc-Bdturing-Parameters(仅风控场景存在)
这是风控场景下新增的核心参数,用于传递验证码验证相关的加密信息,格式为 Base64
编码的 JSON 字符串,解码后包含以下关键信息:
{"code": "10000","from": "","type": "verify","version": "","region": "cn","subtype": "slide","ui_type": "",// 验证核心数据:包含验证码的加密信息(如滑块位置、验证密钥、签名数据等),是前端完成验证(如滑块拼接)并向服务器提交校验的关键参数,通常经过加密处理,防止客户端篡改。"detail": "RO*Mi3PpSNqfmozvOwvgKMp2qjAMrFVdOX7nvoG23LZNmq0qiMIGPu1ZCJFNkuHDPa2TTdGt3CIjSW-LQaebG3FcyPAUM*HIL4zRuGZF7d3-PvsXVR5udjKaFrgawTI2B4o*C9igCXeWpg-L5v45knyuNWXRTBEzwobcAZ4CLRs5mCv9F6qVA49gBtgwhc1Qqa1-N0cirPX4C0vg6pYqk-31OZH-onT8R6xuFozLqcfS3d*aCsj7Y-h643FTdg1wfUrpWBAez2uDTihMVaHx7PxxS4y3zfvAiQk935B1hXLmKtVMp3olGDUv8qB1VLEbywcx6fyWx2Ri7RDlv9cYwRFvBVhiOzIU3mUiYDZg4PmLJu-NR6fn4J4uwowHX8SaVkgLPaPh2wFSrOGWy1kAIMa*iABNKg..","verify_event": "6124", // 设备指纹(用于标识用户设备)"fp": "verify_md2lmq3b_c8726bda_97ee_806c_961f_df4cb30cb5fa", //服务器环境信息"server_sdk_env": "{\"idc\":\"hl\",\"region\":\"CN\",\"server_type\":\"whale\"}","log_id": "20250714122404F158FEC8C4B67664BB7F",// 是否为辅助手机验证:false表示本次验证不涉及手机辅助验证(如短信验证码辅助滑块验证)"is_assist_mobile": false,// 是否为复杂短信验证:false表示本次验证不涉及多步骤或复杂格式的短信验证。"is_complex_sms": false,"identity_action": "","identity_scene": "","login_status": 0,"aid": 0
}
三、滑块轨迹参数分析
{"canvas_hash": "6450202f1e935055b30dcfac69b21b7e","webgl_hash": "31512603d8157a55323d306cc161fb49","font_hash": "65e00e618994bb8521f38885f03e155679b95e8a","audio_hash": "199.04347527516074","time_offset": -480,"time_zone": "Asia/Shanghai","languages": ["zh-CN"],"plugins": ["PDF Viewer","Chrome PDF Viewer","Chromium PDF Viewer","Microsoft Edge PDF Viewer","WebKit built-in PDF"],"platform": "Win32","max_touch_points": 0,"webdriver": false,"touch_actions": [],"mouse_actions": ["1,1","1,1","1,1"],"device": {},"os": {"name": "Windows","version": "10"},"browser": {"name": "Chrome","version": "138.0.0.0","vendor": [0,1]},"engine": {"name": "Blink","version": "138.0.0.0"},"gpu": {"vendor": "Google Inc. (NVIDIA)","renderer": "ANGLE (NVIDIA, NVIDIA GeForce RTX 3060 (0x00002544) Direct3D11 vs_5_0 ps_5_0, D3D11)"},"fps": 54,"resolution": "1920,1080","browser_size": "1920,1032","page_size": "1920,945","captcha_origin": "0,0","captcha_size": "380, 384","mask_time": 175254233800238,"loading_time": 1752542338120,"ready_time": 1752542338505,}
1.基础环境参数
fps": 54
:Frames Per Second(每秒帧数)。
作用:记录滑块验证过程中设备的帧率,反映操作时的画面流畅度。正常人工操作的帧率通常与设备性能匹配(如手机 / 电脑的默认刷新率),而机器脚本可能出现帧率异常稳定或过高 / 过低的情况,用于辅助反作弊判断。resolution": "1920,1080"
:设备屏幕分辨率(宽度 × 高度,单位像素)。
作用:记录用户操作时的屏幕尺寸,用于确认滑块在屏幕中的相对位置是否合理。例如,不同分辨率下滑块的显示比例和操作轨迹范围会有差异,平台可通过此参数校验轨迹的物理合理性。browser_size": "1920,1032"
:浏览器窗口尺寸(宽度 × 高度,单位像素)。
作用:若在电脑端验证,此参数记录浏览器实际显示区域的大小(可能小于屏幕分辨率,如浏览器未全屏时)。用于定位滑块在浏览器内的显示位置,判断操作轨迹是否在浏览器可视范围内。page_size": "1920,945"
:网页内容区域尺寸(宽度 × 高度,单位像素)。
作用:记录当前网页文档的实际高度(可能大于浏览器窗口高度,存在滚动条)。用于确认滑块所在的网页区域是否在用户可视范围内,避免机器脚本在不可见区域生成轨迹。
2. 滑块位置参数
captcha_origin": "0,0"
:滑块验证码在网页中的左上角坐标(X 轴 ×Y 轴,单位像素)。
作用:以网页左上角为原点(0,0),标记滑块验证码在网页中的起始位置。结合 captcha_size 可确定滑块的绝对位置范围,用于校验后续滑动轨迹是否在滑块区域内。captcha_size": "380, 384"
:滑块验证码的尺寸(宽度 × 高度,单位像素)。
作用:记录滑块验证码的实际显示大小(如滑块图片的宽高),与 captcha_origin 共同框定滑块的交互范围。正常情况下,用户的滑动操作轨迹应完全在这个范围内,若轨迹超出则可能被判定为异常。
3. 时间节点参数
mask_time": 175254233800238
(注:此数值可能存在格式误差,正常时间戳应为 13 位或 16 位,推测可能是 16 位时间戳,即 175254233800238 表示毫秒级时间)
含义:滑块遮罩层加载完成的时间戳(从 1970 年 1 月 1 日 0 点开始的毫秒数)。
作用:记录滑块验证码界面中遮罩层(如模糊背景、提示文字层)加载完成的时间,作为验证流程的起始时间参考。loading_time": 1752542338120
:滑块资源加载完成的时间戳(毫秒级)。
作用:记录滑块核心资源(如滑块图片、缺口图片、动画素材)加载完成的时间,标志着滑块验证界面已准备好接收用户操作。ready_time": 1752542338505
:滑块验证界面完全就绪的时间戳(毫秒级)。
作用:记录滑块界面所有元素(包括交互事件绑定、动画初始化)加载完成,用户可开始滑动的时间。从 loading_time 到 ready_time 的间隔反映了界面初始化的耗时,正常情况下应与设备性能匹配,过短或过长可能被判定为异常。
这些参数并非直接记录滑动轨迹(如鼠标 / 手指的 X/Y 轴坐标变化、滑动速度等),而是通过环境信息、位置范围、时间间隔构建验证场景的 “基础框架”,与实际滑动轨迹数据(如坐标序列、时间间隔)结合后,可从多个维度判断操作是否符合人类行为特征:
- 例如,轨迹是否在滑块尺寸范围内、时间间隔是否符合正常反应速度、设备参数是否与常见用户环境匹配等。
- 若参数存在矛盾(如轨迹超出滑块尺寸、时间戳异常跳跃),平台可能判定为机器脚本攻击,拒绝验证通过。
一、设备与环境指纹参数(用于设备唯一性识别与真实性校验)
1. 浏览器 / 系统底层特征哈希
-
"canvas_hash": "6450202f1e935055b30dcfac69b21b7e"
- 含义:Canvas 画布指纹哈希值。
- 原理:通过浏览器渲染特定图形(如文字、渐变)生成的唯一哈希,不同设备 / 浏览器因显卡驱动、字体渲染引擎差异,生成的哈希值不同。
- 作用:标识设备唯一性,同一设备多次操作的
canvas_hash
应一致,若频繁变化可能被判定为脚本伪造环境。
-
"webgl_hash": "31512603d8157a55323d306cc161fb49"
- 含义:WebGL 图形接口指纹哈希值。
- 原理:通过 WebGL(浏览器 3D 渲染接口)返回的设备显卡信息、渲染能力生成的哈希,反映显卡型号、驱动版本等硬件特征。
- 作用:补充设备硬件指纹,与
canvas_hash
共同验证设备真实性(机器脚本可能篡改显卡信息,导致哈希异常)。
-
"font_hash": "65e00e618994bb8521f38885f03e155679b95e8a"
- 含义:系统字体指纹哈希值。
- 原理:通过检测浏览器支持的字体列表(字体名称、渲染效果)生成的哈希,不同操作系统 / 安装的字体组合会导致哈希差异。
- 作用:验证设备操作系统和字体环境的真实性,机器脚本可能缺少真实用户的字体库,导致哈希与正常设备不匹配。
-
"audio_hash": "199.04347527516074"
- 含义:音频指纹哈希值(或特征值)。
- 原理:通过浏览器音频 API 生成特定频率的音频信号并分析其返回结果,不同设备的声卡、音频驱动会导致特征差异。
- 作用:进一步补充设备硬件指纹,尤其用于区分真实设备与虚拟机(虚拟机音频驱动特征与物理机不同)。
2. 时间与地域特征
-
"time_offset": -480
- 含义:本地时间与 UTC 时间的偏移量(单位:分钟)。
- 计算逻辑:UTC时间 + time_offset分钟 = 本地时间,此处 -480 对应北京时间(UTC+8,即 +480 分钟,可能因参数定义方式不同显示为负值)。
- 作用:验证用户声称的时区与实际时间偏移是否一致,避免机器脚本伪造时区信息。
-
"time_zone": "Asia/Shanghai"
- 含义:用户设置的时区。
- 作用:与
time_offset
联动校验,例如 “Asia/Shanghai” 应对应 +480 分钟偏移,若不匹配则可能为异常环境。
-
"languages": ["zh-CN"]
- 含义:浏览器设置的首选语言。
- 作用:结合时区、操作行为判断用户地域合理性(如中文语言 + 上海时区符合国内用户特征),异常组合(如俄文语言 + 上海时区)可能触发风控。
3. 设备与系统基础信息
-
"platform": "Win32"
- 含义:操作系统平台类型(32 位 Windows)。
- 作用:标识设备类型(电脑 / 手机 / 平板),与后续浏览器、显卡信息联动校验(如 Win32 平台不应出现移动设备显卡信息)。
-
"os": {"name": "Windows", "version": "10"}
- 含义:操作系统名称与版本。
- 作用:记录系统版本,用于判断环境兼容性(如特定系统版本的浏览器行为特征),机器脚本可能伪造高版本系统但实际行为不符。
-
"browser": {"name": "Chrome", "version": "138.0.0.0", "vendor": [0,1]}
- 含义:浏览器名称、版本及厂商标识。
- 作用:浏览器是操作的核心载体,版本号与厂商标识需与
platform
匹配(如 Chrome 在 Win32 平台的正常版本范围),异常版本(如未发布的版本号)可能被判定为伪造。
-
"engine": {"name": "Blink", "version": "138.0.0.0"}
- 含义:浏览器渲染引擎名称与版本。
- 原理:Chrome 浏览器基于 Blink 引擎,引擎版本应与浏览器版本一致。
- 作用:校验浏览器内核真实性,机器脚本可能篡改浏览器名称但未同步修改引擎信息,导致版本不匹配。
-
"gpu": {"vendor": "Google Inc. (NVIDIA)", "renderer": "ANGLE (NVIDIA, NVIDIA GeForce RTX 3060 ...)"}
- 含义:显卡厂商与渲染器信息。
- 细节:NVIDIA GeForce RTX 3060 为具体显卡型号,ANGLE 是浏览器调用显卡的适配层。
- 作用:硬件级特征校验,虚拟机或脚本可能使用虚拟显卡(如 VMware 显卡),与真实显卡信息差异会触发风控。
二、交互行为特征参数(用于判断操作是否符合人类行为逻辑)
1. 输入设备与操作记录
-
"max_touch_points": 0
- 含义:设备支持的最大触摸点数。
- 逻辑:0 表示当前设备为非触摸设备(如台式电脑),触摸设备(手机 / 平板)通常≥1。
- 作用:判断设备类型(触摸 / 非触摸),避免脚本在非触摸设备上模拟触摸操作(逻辑矛盾)。
-
"webdriver": false
- 含义:是否启用 WebDriver(自动化测试工具标记)。
- 原理:Selenium 等自动化工具会在浏览器中留下
webdriver: true
的标记,真实用户浏览器默认为false
。 - 作用:核心反作弊指标,若为
true
直接判定为机器脚本。
-
"touch_actions": []
- 含义:触摸操作记录(空数组表示无触摸行为)。
- 作用:与
max_touch_points: 0
联动,非触摸设备下触摸行为应为空,若存在记录则异常。
-
"mouse_actions": ["1,1", "1,1", "1,1"]
- 含义:鼠标操作特征记录(推测格式为 操作类型,次数 或 按钮,状态)。
- 作用:记录滑块验证前的鼠标交互次数,人类操作会有随机的鼠标移动 / 点击,脚本可能生成规律化记录(如重复的 1,1)。
2. 界面与显示参数(复用自之前的轨迹参数,此处补充环境关联)
"fps": 54
"resolution": "1920,1080"
"browser_size": "1920,1032"
"page_size": "1920,945"
"captcha_origin": "0,0"
"captcha_size": "380, 384"
作用:与之前分析的轨迹参数一致,用于定位滑块在屏幕 / 浏览器中的位置,判断鼠标轨迹是否在合理范围内(详见上一篇分析)。
三、安全检测与环境完整性参数(用于识别是否存在调试或篡改行为)
"detectors": {...}
反调试与环境检测结果
包含 RegToString
、FuncToString
、Debugger
等多个检测项,每个项包含 enabled
(是否启用检测)和 value
(检测结果,0 = 正常,1 = 异常)。
核心项解释:
-
"Debugger": {"enabled": false, "value": 0}
- 说明:检测是否启用浏览器调试工具(如 F12 开发者工具),脚本常通过调试工具篡改参数,启用则异常。
-
"FuncToString": {"enabled": true, "value": 0}
- 说明:检测函数序列化方法是否被篡改(脚本可能修改
Function.toString()
隐藏自身逻辑)。
- 说明:检测函数序列化方法是否被篡改(脚本可能修改
-
"Performance": {"enabled": true, "value": 1}
- 说明:检测性能 API 是否可用,真实浏览器通常支持,脚本可能禁用以隐藏操作耗时。
作用:判断当前环境是否被调试或篡改,任何一项
value=1
都会增加作弊嫌疑。