mirror of
https://github.com/Wei-Shaw/sub2api.git
synced 2026-10-27 08:05:33 +00:00
IdentityService 把客户端 User-Agent 作为账号级持久身份缓存(Redis fingerprint:<accountID>),覆盖规则是"只升不降"的纯数值版本比较,且对 UA 内容 不做任何合法性校验: - userAgentVersionRegex 不锚定,能从 claude-cli/999.0.0-local 解析出 999.0.0 - isNewerVersion 只比数值 + 产品名,999.0.0 恒大于任何真实版本 - fingerprintTTL 7 天配合每 24 小时懒续期,活跃账号上的指纹近乎永不过期 - IdentityCache 只有 Get/Set,管理端也没有重置入口 一个本地构建客户端发出 claude-cli/999.0.0-local 即可把账号身份永久钉死。此后 该账号所有上游请求在 HTTP 头与请求体 cc_version 两处都声称这个不存在的版本, 被上游判为非正版客户端并返回不带限流重置头的 429;无重置头又落到 5 秒兜底冷却, 账号池收缩后对外表现为 503 风暴。一条 failover 请求即可连带毒化多个账号—— 指纹写入发生在上游调用之前,三次上游尝试全失败也照样毒化。 改动: - 新增 isAcceptableFingerprintUserAgent,校验 <product>/<major>.<minor>.<patch> 后必须紧跟空白或结束(拒绝 -local/-dev/+build 等本地构建后缀),并对 claude-cli 的主版本号相对 claude.CLICurrentVersion 设上限(挡掉 999 这类哨兵版本)。 非 claude-cli 产品只校验形态,避免误伤其他合法客户端。 - 创建与升级两条路径共用该校验。只在 isNewerVersion 处加校验不够: createFingerprintFromHeaders 首次创建时同样会原样保存畸形 UA,删键恢复后 账号可被同一客户端立即再次毒化。 - 读取时自愈:缓存中已是畸形 UA 时(本次加固之前写入的),用本次请求的合法 UA 或默认指纹替换并回写。否则存量已中招的账号仍然只能靠手工删 Redis 键恢复。 - 仅在真正阻止了一次写入时记录被拒 UA,便于定位污染源,同时避免被毒化客户端的 高频重试刷屏。 Fixes #5254