跳转至

[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 全量导出(未脱敏)

// v0.10.96 注释说"脱敏 settings" 但实际没改
const safeSettings: any = { ...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 列出哪些被脱敏让用户和开发者都透明。

元教训

  1. "写死字符串"是反模式:版本号 / config / URL 都应该从单一源(manifest / settings)读
  2. "导出给开发者"≠ 完全公开:用户主观觉得"导出给开发者"是可控的,但 JSON 可能转发、上传、贴公开论坛 → 默认脱敏 + 透明告知
  3. 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