Files
wx-win-agent/docs/validation/Review-Database-Management-Safety.md

5.3 KiB
Raw Permalink Blame History

Review 修复:数据库读取与管理操作安全

范围和结论

用户确认同时完善数据库读取链路与四项代码问题,但不实现未读导航,特殊消息扩展及此前列出的真机验收继续暂缓。本轮未连接 Windows、未发布、未操作微信或真实联系人。

本记录包含 Linux 代码检查和有限 Windows 只读验证,不是所有写操作的完整真机验收记录。 不同微信版本的兼容性与长时间稳定性仍见 PENDING

实现

数据库联系人

  • 新增 WechatContactDbReader,复用 SqlCipherDatabaseReader 的只读连接及每次打开前的 page-1 HMAC 校验;不读取 UI 树、不写微信数据库。
  • db contacts 与管理 API 共用读取器;分页 SQL 使用参数绑定、稳定 username 排序及多取一行判断 hasMore,不以显示名去重。
  • CLI 新增 --limit110000,默认 200)、--offset(默认 0),返回 hasMore/nextOffset--contains 是区分大小写的字面量子串;默认输出仍脱敏。
  • C# 入口 GetContactsPageAsync 支持账号、密钥文件和群/非群筛选。未选择账号且密钥缓存包含多个账号时返回 InvalidArgument,不会随便选取一个。
  • GetFriendsAsync 保留显式数量上限;全量读取用分页接口。GetRecentGroupsAsync 兼容名称仅返回数据库已知群,不承诺最近活动顺序。
  • 联系人详情只映射已知字段;未知标签、签名、来源及共同群数量保持 null。非群联系人数据不能用于证明好友关系。
  • 群成员使用 chat_roomchatroom_membercontact 的只读 joinGetGroupMembersAsync 支持稳定 username 和分页,不回退 UI 枚举;已用测试群脱敏验证。
  • offset 分页不是跨页事务快照;期间发生增删时仍可能重复/遗漏。

URL 卡片与草稿

  • 删除“输入 URL 后按 Enter 即宣称发送卡片”的实现。
  • SendUrlCardAsync 不要求确认令牌;将 URL 暂存到文件传输助手,打开微信内置浏览器后通过“更多 → 转发…”生成原生链接卡片,并支持转发附言;目标草稿不覆盖。
  • 需要文本形式的 URL 时显式使用已有 SendTextAsync,复用其草稿保护和发送确认;原生卡片仍未实现。

OCR/语音转文字

  • 按同一批非空气泡解析消息指纹,修复空气泡导致目标元素与解析索引错位的问题。
  • 绑定目标消息 runtime ID、原始名称和列表布局,只读取该消息下新增的 Text 节点;检查会话归属、布局和目标未被替换。
  • 连续两次 500ms 采样相同才返回;10 秒未确认则返回 ResultUnconfirmed,支持调用方取消。
  • 不读取整窗文本或无可靠归属的 OCR 弹窗。两次稳定采样不是后台完成标志;独立结果窗定位、版本兼容及完成标志仍需后续验证。

管理操作、保存与结果

  • 输入限定唯一模态管理弹窗;同名匹配要求唯一可见可用控件,不再任取首个节点。
  • 选人拒绝重复输入,通过唯一列表项及复选框检查选中状态,不盲目切换已勾选对象。
  • 删除联系人保留聊天记录时必须确认“不同时删除聊天记录”;无法确认则不提交删除确认。
  • 朋友圈编辑拒绝覆盖已有草稿;评论输入限定目标朋友圈条目。
  • 单文件保存要求目标不存在且父目录存在;保存后检查非空文件、可读取且无活动写入者、连续大小稳定及保存弹窗关闭,最多等待 15 秒。该证据不等同于远端附件完整性校验。
  • 笔记附件保存只接受现存空目录,未有业务结果证据时仍返回未确认。
  • 多项管理、朋友圈、转发等提交后等待模态窗口关闭并连续稳定,再返回 Success=true;单文件下载和笔记附件保存另有文件系统后置检查。未稳定时返回 ResultUnconfirmed,禁止自动重试。
  • 原有单命令队列和确认令牌约束保持不变;不支持的弹窗布局停止操作,不以整窗首个输入框或键盘盲打兜底。

Linux 检查

执行:

dotnet build WxAgent.sln -c Release -p:EnableWindowsTargeting=true --no-restore --verbosity minimal
dotnet test tests/node-agent/WxAgent.Core.Tests -c Release --no-restore --verbosity minimal
python3 tests/node-agent/check_contact_query.py
git diff --check

结果:

  • Release 全量编译通过,0 warnings / 0 errors。
  • Core 测试 145/145 通过;新增参数边界、分页标志、同名保留、唯一定位策略、未确认结果和派生文本差量测试。
  • Python 标准库 SQLite 内存库测试通过,执行生产 SQL,覆盖超过两页的数据、同名联系人、群筛选、字面量 %/_ 过滤及注入字符串;未接触微信数据库。
  • git diff --check 通过。

Windows 状态

Windows UI 已恢复后,使用 UTF-16LE Base64 PowerShell 任务启动最新发布包,在交互用户会话中向“文件传输助手”执行 URL 卡片流程:任务结果 0,返回 Success=true,微信 UI 接受了 URL-card forwarding;UI 树随后出现测试 URL 和附言。此前 Session 0 的 SessionLocked 仅属于错误启动方式。群成员数据库脱敏读取也已验证。完整写操作矩阵、不同版本兼容性和 M6 耐久仍保留在 PENDING。