Files
jiapuapp/docs/fourth-pass-security-and-operation-audit-2026-08-23.md
T

155 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 当前项目与参考项目第四轮安全及操作流程复审
审查日期:2026-08-23
参考项目:`C:\Users\Rain\Desktop\job\Jiapu-App`(浏览器,已登录)
当前项目:`C:\Users\Rain\Desktop\job\jiapuapp`MuMu,已登录)
后端项目:`C:\Users\Rain\Desktop\job\Genealogy`
## 结论
第四轮聚焦前三轮容易遗漏的安全分支:修改密码、换绑手机号、密码找回、未保存返回、账号注销、验证码归属、会话失效和动态错误提示。
- 用户记忆中的“需要输入密码”不仅存在于内容查看,也存在于参考项目的更换手机号流程:参考项目要求登录密码和新手机号。
- 当前项目换绑手机号只验证新手机号收到的短信码;行为验证码只证明操作像真人,不证明操作者仍掌握旧密码或旧手机号。后端最新接口也只有 `phone + smsCode`,这是已确认的安全契约差异,不是页面漏放一个输入框。
- 当前后端修改密码和换绑手机号成功后均未发现注销或踢除既有会话的逻辑;前端也继续保持登录。旧会话是否仍有效不能依赖界面推断,但当前项目全局搜索没有发现对应失效钩子,应按安全缺口处理。
- 新增确认 4 项:换绑缺少当前身份二次验证、改密/换绑后既有会话未失效、验证码归属提示写成“当前手机号”、密码切换与动态错误的无障碍关联不足。
- 前三轮的 14 项参考差异和 4 项当前流程缺陷继续成立。加上本轮 4 项,当前未决合计为 14 项参考差异和 8 项当前流程/安全/无障碍缺陷,共 22 项。
- 本轮没有发送短信、修改密码、换绑手机号、注销账号或写入业务数据。
## 编号流程与健康度
| 步骤 | 操作流程 | 健康度 | 第四轮结论 |
| --- | --- | --- | --- |
| 1 | 当前家谱切换 | 健康 | 从 MANUALTEST 切换到“真机联调10159371”后,首页立即更新;进入家族页再返回,选择仍保持 |
| 2 | 我的页面进入账户安全 | 健康 | 账户与安全入口清楚,手机号脱敏、账号编号、修改密码、换绑手机和微信绑定集中展示 |
| 3 | 修改密码初始页 | 健康 | 当前密码、新密码、确认密码齐全;明确要求 8–32 位且包含字母和数字,比参考项目提示更完整 |
| 4 | 修改密码空提交 | 基本健康 | 三项错误均就近显示,没有发起请求;但错误没有 `role=alert/aria-live`,也未通过 `aria-describedby` 关联输入框 |
| 5 | 修改密码显示/隐藏 | 有无障碍风险 | 使用可点击 `view role=button`,没有 `aria-pressed`,Android 结构中不可聚焦;触摸可用但键盘/辅助技术语义不完整 |
| 6 | 换绑手机号初始页 | 不健康 | 只有新手机号和新手机号短信码;缺少旧密码、旧手机号验证码或近期重新认证 |
| 7 | 新手机号已填但未取码后提交 | 有瑕疵 | 页面提示“请先获取当前手机号的验证码”,实际短信发送目标是新手机号,文案与契约相反 |
| 8 | 换绑表单填写后返回 | 健康 | 会弹出放弃确认,继续填写和确认放弃两个出口清楚;本轮确认放弃后未保留测试号码 |
| 9 | 关于与设置、退出和账号注销 | 基本健康 | 当前项目比参考项目多一层入口,但注销具有短信验证、再次确认和不可恢复说明,明显强于参考项目的一次确认 |
| 10 | 参考项目修改密码 | 基本健康 | 旧密码、新密码、重复新密码齐全,但没有展示密码强度规则 |
| 11 | 参考项目更换手机号 | 安全基线较明确 | 明确要求登录密码和新手机号;未展示短信验证,整体安全性仍需后端保证 |
| 12 | 参考项目谱文查看密码 | 可用 | 点击谱文先输入查看密码,可进入忘记密码流程 |
| 13 | 参考项目内容密码找回 | 可用但较弱 | 回答任意一组自定义密保即可重设;当前项目改用实名手机号短信找回,身份凭据不同 |
## 新增发现
### 1. P0:换绑手机号缺少当前身份二次验证
参考项目要求“登录密码 + 新手机号”;当前页面只要求“新手机号 + 发给新手机号的短信验证码”。当前后端 `AppPhoneChangeBody` 也只有 `phone``smsCode`,服务端先校验新手机号短信票据,再直接更新用户手机号和密码登录标识。
风险场景是登录态或设备被他人临时取得后,对方只需掌握自己的新手机号,就可以把账号登录标识换到该号码。行为验证码只能降低自动化滥用,不能替代旧密码、旧手机号验证码或近期重新登录。
建议由后端先确定唯一安全契约,至少选择一种:
1. 旧密码验证后,再验证新手机号短信;
2. 旧手机号短信验证后,再验证新手机号短信;
3. 接受近期完成的重新认证票据,再验证新手机号短信。
前端应分步骤明确显示“验证当前身份”和“验证新手机号”,不能把两个目标写成一个模糊的“安全验证”。
| 参考项目 | 当前项目 |
| --- | --- |
| ![参考项目更换手机号要求登录密码](audit-2026-08-23-round-4/17-reference-change-phone.png) | ![当前项目仅验证新手机号短信](audit-2026-08-23-round-4/09-current-change-phone.png) |
### 2. P1:修改密码、换绑手机号后既有会话没有明确失效
后端 `changePassword` 更新凭据后直接返回;`changePhone` 更新手机号和密码登录标识后直接返回。全后端项目只发现账号注销、显式退出和其他独立流程调用 `StpUtil.logout()`,没有发现改密/换绑后的会话踢除或安全版本号失效机制。前端成功后也只显示提示,继续保留当前登录态。
完成条件:
- 明确当前会话是否保留;
- 至少让其他设备和旧令牌失效;
- 若无法区分当前与其他会话,成功后统一退出并要求使用新凭据重新登录;
- 增加“旧令牌访问受保护接口必须失败”的后端集成测试。
### 3. P2:换绑验证码提示把“新手机号”写成“当前手机号”
输入合法新手机号但未获取验证码,点击提交后显示“请先获取当前手机号的验证码”。代码实际把输入的新手机号作为短信接收号码,后端测试名称也明确为 `changePhoneVerifiesNewPhoneTicket...`
这会直接影响用户判断短信应该去哪里查收。应改为“请先获取新手机号的验证码”,并让标题、说明、字段错误、短信反馈统一使用“当前手机号/新手机号”两个固定术语。
![当前项目错误提示把新手机号写成当前手机号](audit-2026-08-23-round-4/12-current-phone-no-code-error.png)
### 4. P2:密码页的动态错误和显示开关缺少完整无障碍语义
从截图可确认错误是就近显示的,这是优点;从实现和 Android 无障碍结构可确认:
- 动态错误文本没有 `role="alert"``aria-live`
- 输入框没有 `aria-describedby` 指向对应错误;
- 显示/隐藏密码使用 `view role="button"`,没有 `aria-pressed`Android 结构中不可聚焦;
- 换绑手机号的字段错误存在相同的动态播报与关联问题。
![当前修改密码的字段级错误](audit-2026-08-23-round-4/08-current-password-validation.png)
截图不能证明读屏器实际播报结果,完成前仍需 TalkBack、外接键盘和焦点顺序真机测试。
## 已确认健康或优于参考项目的部分
- 修改密码明确展示强度规则,并校验新旧密码不能相同、两次新密码必须一致。
- 修改密码和换绑手机号都具备未保存返回保护。
- 当前账号注销不是参考项目的一次确认后立即清理本地登录,而是先提示不可恢复、验证当前绑定手机号短信,再次确认后提交。
- 当前内容密码支持设置、修改、关闭和短信找回;参考项目内容密码找回依赖用户自定义密保问题。
- 当前账户安全页对手机号做了脱敏展示。
![当前账号注销的第一层高风险确认](audit-2026-08-23-round-4/21-current-deactivate-warning.png)
## 密码相关操作的最终判定
| 密码场景 | 是否缺失 | 第四轮判定 |
| --- | --- | --- |
| 登录密码 | 否 | 当前支持密码登录、修改和短信找回 |
| 谱文查看密码 | 否 | 当前按单篇谱文可选设置,参考项目创建时强制设置 |
| 重要证件查看密码 | 否 | 当前按单份证件可选设置,参考项目创建时强制设置 |
| 成长记录查看密码 | 否 | 当前按单条记录可选设置,参考项目创建时强制设置 |
| 内容密码找回 | 否 | 当前实名手机号短信,参考项目密保问题 |
| 换绑手机号前输入当前密码 | 是 | 参考项目有;当前前端与后端契约均没有,应作为安全任务处理 |
| 安全操作后会话失效 | 未闭环 | 当前代码没有发现改密/换绑后的旧会话失效机制 |
参考项目内容密码证据:
| 查看密码 | 忘记密码 |
| --- | --- |
| ![参考项目查看谱文需要密码](audit-2026-08-23-round-4/14-reference-article-password.png) | ![参考项目通过密保找回内容密码](audit-2026-08-23-round-4/15-reference-password-recovery.png) |
## 本轮完整截图顺序
| 步骤 1:切换前 | 步骤 2:切换后 | 步骤 3:进入家族页 |
| --- | --- | --- |
| ![当前家谱切换前](audit-2026-08-23-round-4/01-current-home-before-switch.png) | ![当前家谱切换后](audit-2026-08-23-round-4/02-current-after-switch.png) | ![切换后进入家族页](audit-2026-08-23-round-4/03-current-family-after-switch.png) |
| 步骤 4:返回仍保持 | 步骤 5:我的 | 步骤 6:账户安全 |
| --- | --- | --- |
| ![返回家谱页后仍保持选择](audit-2026-08-23-round-4/04-current-home-after-family.png) | ![当前我的页面](audit-2026-08-23-round-4/05-current-profile.png) | ![当前账户与安全](audit-2026-08-23-round-4/06-current-account-security.png) |
| 步骤 7:修改密码 | 步骤 8:字段校验 | 步骤 9:换绑手机号 |
| --- | --- | --- |
| ![当前修改密码](audit-2026-08-23-round-4/07-current-change-password.png) | ![当前密码字段校验](audit-2026-08-23-round-4/08-current-password-validation.png) | ![当前换绑手机号](audit-2026-08-23-round-4/09-current-change-phone.png) |
| 步骤 10:验证码归属错误 | 步骤 11:放弃保护 | 步骤 12:个人中心下半段 |
| --- | --- | --- |
| ![新手机号验证码被写成当前手机号](audit-2026-08-23-round-4/12-current-phone-no-code-error.png) | ![换绑手机号放弃确认](audit-2026-08-23-round-4/13-current-phone-discard.png) | ![当前个人中心下半段](audit-2026-08-23-round-4/19-current-profile-bottom.png) |
| 步骤 13:关于与设置 | 步骤 14:注销警告 | 步骤 15:参考项目我的 |
| --- | --- | --- |
| ![当前关于与设置](audit-2026-08-23-round-4/20-current-about-settings.png) | ![当前注销账号警告](audit-2026-08-23-round-4/21-current-deactivate-warning.png) | ![参考项目我的](audit-2026-08-23-round-4/18-reference-profile.png) |
| 步骤 16:参考查看密码 | 步骤 17:参考密码找回 | 步骤 18:参考修改密码 |
| --- | --- | --- |
| ![参考项目查看密码](audit-2026-08-23-round-4/14-reference-article-password.png) | ![参考项目密码找回](audit-2026-08-23-round-4/15-reference-password-recovery.png) | ![参考项目修改密码](audit-2026-08-23-round-4/16-reference-change-password.png) |
| 步骤 19:参考更换手机号 |
| --- |
| ![参考项目更换手机号](audit-2026-08-23-round-4/17-reference-change-phone.png) |
## 验证范围与限制
- 当前项目实际点击:家谱切换、家族页往返、我的、账户与安全、修改密码、空提交校验、换绑手机号、合法手机号未取码校验、填写后返回、放弃确认、关于与设置、账号注销第一层确认。
- 参考项目实际进入:谱文查看密码、内容密码找回、修改密码、更换手机号、我的页面。
- 输入的 `13800138000` 只用于前端本地校验;没有点击获取验证码,随后通过放弃确认清空。
- 没有提交密码、短信、手机号、注销、支付、提现、审批或其他写操作。
- 没有受保护的当前项目真实内容样本,因此本轮仍未执行当前内容密码错误、成功、找回和 15 分钟授权过期的端到端测试。
- 没有执行 TalkBack、外接键盘或多设备旧令牌访问测试;无障碍和会话失效结论分别来自截图加结构检查、前后端代码检查,仍需专项真机/集成测试收口。