环境信息
| 项目 |
值 |
| TscanPlus |
v3.4.3 (Windows ARM64) |
| OS |
Windows 11 Pro 26200 |
| 风鸟账号 |
VIP,有效期至 2031-09-06 |
| 验证时间 |
2026-09-08 |
问题描述
风鸟 Riskbird 的 cookie 验证始终报 ❌ 无效 cookie,但该 cookie 实际完全有效——服务端已接受并返回 VIP 数据。根因是风鸟网站已改版为 Nuxt SSR,验证逻辑依赖的旧版选择器 arg1='...' / #J_subdomain 在新版页面中已不存在,正则匹配为空,导致「请求成功但判定失败」。
复现步骤
- 在信息收集配置中填入有效的风鸟 VIP cookie
- 点击风鸟 Riskbird 旁的「验证」按钮
- 观察到 ❌ 风鸟Riskbird(验证失败)
实际行为 vs 期望行为
| 维度 |
实际 |
期望 |
| 验证请求 |
GET /ent/上海斗象信息科技有限公司.html → HTTP 200,含完整企业数据 + VIP 信息 |
— |
| 验证结果 |
❌ 验证失败 |
✅ 验证成功 |
根因分析
1. 二进制中的验证逻辑字符串聚集区
对 TscanPlus_Win_Arm64.exe(UPX 脱壳后,脱壳后 136MB)进行字符串分析,风鸟验证相关代码处以下字符串紧密相邻(同一字符串池区域,offset ≈ 0x3A1B4C6):
arg1='([^']+)'
InvestmentInfo
Riskbird
#J_subdomain p
#__NUXT_DATA__
其中 arg1='([^']+)' 是验证逻辑用于从风鸟企业页 HTML 提取关键值的正则。验证流程依赖该正则匹配结果判断 cookie 是否有效。
2. 风鸟网站改版,旧选择器已消失
风鸟网站已改版为 Nuxt SSR。对当前页面实测:
| 选择器 |
旧版(验证逻辑依赖) |
新版(当前实测) |
arg1= |
存在 |
0 次(已移除) |
#J_subdomain |
存在 |
0 次(已移除) |
__NUXT_DATA__ |
— |
1 次(新结构,数据注入于此) |
data-ssr / _nuxt |
— |
233 处(Nuxt SSR 确认) |
实测命令与结果:
# 首页
$ curl -s https://www.riskbird.com/ | grep -c "arg1="
0
$ curl -s https://www.riskbird.com/ | grep -c "J_subdomain"
0
$ curl -s https://www.riskbird.com/ | grep -c "__NUXT_DATA__"
1
# 企业详情页
$ curl -s "https://www.riskbird.com/ent/上海斗象信息科技有限公司.html" | grep -c "arg1="
0
$ curl -s "https://www.riskbird.com/ent/上海斗象信息科技有限公司.html" | grep -o "arg1='[^']*'"
# (无输出,正则匹配为空)
因果链:正则 arg1='([^']+)' 在新版页面匹配为空 → 验证逻辑取不到值 → 判定「验证失败」。
3. cookie 实际有效的证据
3a. SSR 页面注入了 VIP 数据
带 cookie 请求企业页,__NUXT_DATA__ 中包含 VIP 信息,证明服务端接受了 cookie 并返回了 VIP 级别数据:
$ curl -s -b "<cookie>" "https://www.riskbird.com/ent/上海斗象信息科技有限公司.html" \
| grep -oiE 'vipInfo|vipEndTime|isVip|orderNo|2031'
2 2031
3 isVip
1 orderNo
1 vipInfo
__NUXT_DATA__ 中含 vipInfo、vipEndTime、isVip、orderNo 及年份 2031(对应 VIP 有效期),说明 cookie 通过了服务端鉴权,VIP 状态数据已注入页面。
3b. API 鉴权对照
对风鸟后端 API 做对照测试:
| 请求 |
响应 |
无 cookie 调用 /riskbird-api/companyInfo/list/companyGroup |
401(未授权) |
无 cookie 调用 /riskbird-api/query/company/searchCompanyPageByWeb |
500 |
401 证明后端在校验 token。结合 3a(带 cookie 的页面返回 VIP 数据),可确认 cookie 通过了鉴权。
4. InvestmentInfo 长期为空的旁证
config/config.db 的 info 表中,InvestmentInfo(风鸟负责填充的股东信息字段)在所有历史记录中全部为空:
-- 实测 info 表所有记录的 InvestmentInfo 列
SELECT InvestmentInfo FROM info;
-- 结果:全部为空字符串 ''
这印证风鸟模块从未成功取过数据——与本次验证失败同源,是长期存在的 bug,非个案。
建议修复方向
风鸟新版页面已将数据通过 <script id="__NUXT_DATA__" data-ssr="true"> 注入,验证逻辑可改为以下任一方案:
- 从
__NUXT_DATA__ 提取:解析 JSON,从 basicResult/detailResult 或 vipInfo 字段判断有效性
- 简化校验:直接校验 HTTP 状态码 +
<title> 是否包含企业名(而非依赖 arg1= 正则)
- 调用后端 API:请求
/riskbird-api/... 并检查 JSON success/code 字段
相关文件
- 验证逻辑字符串位置:
TscanPlus_Win_Arm64.exe(UPX 脱壳后)offset ≈ 0x3A1B4C6
- 风鸟 cookie 配置项:
config/config.yaml → InfoRiskbirdCookie
- 股东信息存储:
config/config.db → info 表 → InvestmentInfo 列
环境信息
问题描述
风鸟 Riskbird 的 cookie 验证始终报 ❌ 无效 cookie,但该 cookie 实际完全有效——服务端已接受并返回 VIP 数据。根因是风鸟网站已改版为 Nuxt SSR,验证逻辑依赖的旧版选择器
arg1='...'/#J_subdomain在新版页面中已不存在,正则匹配为空,导致「请求成功但判定失败」。复现步骤
实际行为 vs 期望行为
GET /ent/上海斗象信息科技有限公司.html→ HTTP 200,含完整企业数据 + VIP 信息根因分析
1. 二进制中的验证逻辑字符串聚集区
对
TscanPlus_Win_Arm64.exe(UPX 脱壳后,脱壳后 136MB)进行字符串分析,风鸟验证相关代码处以下字符串紧密相邻(同一字符串池区域,offset ≈ 0x3A1B4C6):其中
arg1='([^']+)'是验证逻辑用于从风鸟企业页 HTML 提取关键值的正则。验证流程依赖该正则匹配结果判断 cookie 是否有效。2. 风鸟网站改版,旧选择器已消失
风鸟网站已改版为 Nuxt SSR。对当前页面实测:
arg1=#J_subdomain__NUXT_DATA__data-ssr/_nuxt实测命令与结果:
因果链:正则
arg1='([^']+)'在新版页面匹配为空 → 验证逻辑取不到值 → 判定「验证失败」。3. cookie 实际有效的证据
3a. SSR 页面注入了 VIP 数据
带 cookie 请求企业页,
__NUXT_DATA__中包含 VIP 信息,证明服务端接受了 cookie 并返回了 VIP 级别数据:__NUXT_DATA__中含vipInfo、vipEndTime、isVip、orderNo及年份2031(对应 VIP 有效期),说明 cookie 通过了服务端鉴权,VIP 状态数据已注入页面。3b. API 鉴权对照
对风鸟后端 API 做对照测试:
/riskbird-api/companyInfo/list/companyGroup/riskbird-api/query/company/searchCompanyPageByWeb401 证明后端在校验 token。结合 3a(带 cookie 的页面返回 VIP 数据),可确认 cookie 通过了鉴权。
4. InvestmentInfo 长期为空的旁证
config/config.db的info表中,InvestmentInfo(风鸟负责填充的股东信息字段)在所有历史记录中全部为空:这印证风鸟模块从未成功取过数据——与本次验证失败同源,是长期存在的 bug,非个案。
建议修复方向
风鸟新版页面已将数据通过
<script id="__NUXT_DATA__" data-ssr="true">注入,验证逻辑可改为以下任一方案:__NUXT_DATA__提取:解析 JSON,从basicResult/detailResult或vipInfo字段判断有效性<title>是否包含企业名(而非依赖arg1=正则)/riskbird-api/...并检查 JSONsuccess/code字段相关文件
TscanPlus_Win_Arm64.exe(UPX 脱壳后)offset ≈ 0x3A1B4C6config/config.yaml→InfoRiskbirdCookieconfig/config.db→info表 →InvestmentInfo列