5.3 KiB
5.3 KiB
Review 修复:数据库读取与管理操作安全
范围和结论
用户确认同时完善数据库读取链路与四项代码问题,但不实现未读导航,特殊消息扩展及此前列出的真机验收继续暂缓。本轮未连接 Windows、未发布、未操作微信或真实联系人。
本记录包含 Linux 代码检查和有限 Windows 只读验证,不是所有写操作的完整真机验收记录。 不同微信版本的兼容性与长时间稳定性仍见 PENDING。
实现
数据库联系人
- 新增
WechatContactDbReader,复用SqlCipherDatabaseReader的只读连接及每次打开前的 page-1 HMAC 校验;不读取 UI 树、不写微信数据库。 db contacts与管理 API 共用读取器;分页 SQL 使用参数绑定、稳定 username 排序及多取一行判断hasMore,不以显示名去重。- CLI 新增
--limit(1–10000,默认 200)、--offset(默认 0),返回hasMore/nextOffset。--contains是区分大小写的字面量子串;默认输出仍脱敏。 - C# 入口
GetContactsPageAsync支持账号、密钥文件和群/非群筛选。未选择账号且密钥缓存包含多个账号时返回InvalidArgument,不会随便选取一个。 GetFriendsAsync保留显式数量上限;全量读取用分页接口。GetRecentGroupsAsync兼容名称仅返回数据库已知群,不承诺最近活动顺序。- 联系人详情只映射已知字段;未知标签、签名、来源及共同群数量保持 null。非群联系人数据不能用于证明好友关系。
- 群成员使用
chat_room、chatroom_member、contact的只读 join,GetGroupMembersAsync支持稳定 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。