[ISSUE-0073] 导出 JSON 版本号写死 + settings 未脱敏¶
agent code review 在 v0.10.86-102 改动找到的 🟡 优化 #3 + #4。 单独都不算"严重 bug",但版本号写死会持续误导排障,隐私泄漏关注度也高。
病灶¶
#3 exportedFromVersion 硬编码¶
src/sections/page/log-view.tsx:132 (v0.10.96):
const bundle = {
exportedAt: Date.now(),
exportedFromVersion: '0.10.96', // ← 写死,永远显示 0.10.96
...
};
- v0.10.97 用户导出 → JSON 显示 v0.10.96
- v0.10.102 用户导出 → JSON 仍显示 v0.10.96
- 开发者拿到 JSON 排障:「咦怎么是 0.10.96?」→ 误判用户没升级 → 浪费时间
#4 settings 全量导出(未脱敏)¶
settings 含潜在敏感字段:
- cloudSyncBaseUrl — 用户自建服务地址(可能是内网 / 私域名)
- emailBlacklistCustom — 含用户自家域名 / 私人邮箱
- phoneBlacklistCustom — 含私人号码
- socialBlacklistCustom
- emailNoiseCustom
- followAllowedDomains — 用户公司多域名
- domainBlacklist — 自定义域名黑名单
- followKeywordsWhite / followKeywordsBlack — 用户业务关键词
用户主动点"导出"时没有警告这些会被全量分享。
修(v0.10.103)¶
exportedFromVersion 动态读¶
import { browser } from 'wxt/browser';
let currentVersion = '0.10.x';
try {
const m: any = browser.runtime.getManifest?.();
if (m?.version) currentVersion = m.version;
} catch {}
const bundle = {
exportedFromVersion: currentVersion, // ✅ 实时
...
};
settings 脱敏¶
const SENSITIVE_KEYS: string[] = [
'cloudSyncBaseUrl',
'emailBlacklistCustom',
'phoneBlacklistCustom',
'socialBlacklistCustom',
'emailNoiseCustom',
'followAllowedDomains',
'domainBlacklist',
'followKeywordsWhite',
'followKeywordsBlack',
];
const safeSettings: any = { ...settings };
for (const k of SENSITIVE_KEYS) {
if (safeSettings[k] && String(safeSettings[k]).length > 0) {
safeSettings[k] = `<redacted:${String(safeSettings[k]).length}chars>`;
}
}
// bundle 加 redactedFields 字段透明告知用户
const bundle = {
...,
redactedFields: SENSITIVE_KEYS.filter(k =>
safeSettings[k]?.toString?.().startsWith?.('<redacted:')
),
settings: safeSettings,
};
<redacted:Nchars> 形式 — 开发者知道字段非空,但拿不到具体值。redactedFields 列出哪些被脱敏让用户和开发者都透明。
元教训¶
- "写死字符串"是反模式:版本号 / config / URL 都应该从单一源(manifest / settings)读
- "导出给开发者"≠ 完全公开:用户主观觉得"导出给开发者"是可控的,但 JSON 可能转发、上传、贴公开论坛 → 默认脱敏 + 透明告知
- agent code review 的"优化"也要修:单独不严重的小问题积累会变成产品形象问题
audit_grep 防退化¶
audit_grep:
- pattern: "exportedFromVersion:\\s*['\"]\\d+\\.\\d+\\.\\d+['\"]"
description: "version 硬编码具体数字 X.Y.Z — 必须动态读 manifest"
settings 脱敏的 audit_grep 难写(很多变体),改用 code review 强制:每次修 log-view 时人工确认 SENSITIVE_KEYS 用到了。
相关¶
- [[0070-shared-window-orphan-storage-race-sw-kill|0070-共享窗口孤儿累积-storage漏写-SW-kill竞态]] — 同一次 agent review 找到的另一个修复
- [[0071-spec006-where-taskid-issue-0008-regression|0071-SPEC006-where-taskId-命中ISSUE-0008历史回归]] — 同次 review
- [[0072-cleanuporphan-kills-user-newtabs|0072-cleanupOrphan误杀用户新标签页]] — 同次 review