Scert/doc/全面审查测试与优化记录.md
xuans 6c0ae31cad 完善多对多域名表单重试、项目筛选与关联读取保护
拆分域名表单逻辑,保留部分成功状态,防止重复创建和读取失败误清空关联;补充组合式状态、页面接线及模板回归源码,同步任务与审查文档。本批遵循先开发后统一测试,未执行测试、构建或部署。
2026-09-28 22:05:02 +08:00

196 lines
21 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-09-28,21:54 接续)
多对多前端表单已拆分:同项目服务器候选、编辑前重新读取关联、失败禁用保存及重读入口、资料已创建后的关联重试、防重复和防旧响应覆盖均已开发。资料保存结果不明时阻止盲目重发并要求刷新确认,不声称跨请求原子事务或服务端创建幂等。新增组合式逻辑、管理页接线与模板回归源码已纳入现有测试入口,但没有执行。
修改前检查点 `c732013` 已提交推送,后续候选以 Git 记录为准。本批只进行源码检查及 `git diff --check`;未运行测试、构建、浏览器、SSH、清库或部署,没有新增复审通过或生产验收证据,原始 44 项状态不变。
## 当前仅开发记录(2026-09-28,21:32 接续)
按用户要求先开发后统一测试。新增多对多仓储/HTTP 用例及共享服务器证书路径校验,覆盖一域名多服务器、一服务器多域名、局部修改/清空、去重、失败保留和审计回滚;服务器编辑与部署预检也接入路径冲突检查。新增工作流停止远端调用及 Vue 多选渲染用例,但全部未执行。本阶段只做源码检查、格式化和差异检查,没有测试、构建、浏览器、SSH、清库或部署。
生命周期收尾及读取隔离已在 `709c1ef`,绑定检查点为 `f38e290`;后续源码以 Git 为准。未把旧通过数字转移至新候选,全资源权限和完整部署安全边界仍待开发。证据分层及历史补记见支持矩阵第二十六节,下方保留各批历史范围。
## 当前正式包与浏览器验证(2026-09-28 20:15)
- 正式发布来源为干净提交 `5f9af32`;Windows 包构建成功,清单中 10 个产物的大小和 SHA-256、压缩包内 9 个文件及运行目录主程序与 4 个 Web 文件的 SHA-256 均匹配。实际主程序提供前后端,不是 Vite 或模拟服务。
- 已从可信本机日志核对临时证书 SHA-256,严格连接同时校验主机名;浏览器原报证书签发者不受信任,核对后仅接受该临时入口例外,没有全局忽略证书错误或安装根证书。不能据此宣称公信 TLS 验收通过。
- 浏览器实际读取初始化状态为 200、读取受保护设置为 401、无效令牌兑换为 401,之后设置仍返回 401;响应禁止缓存,真实令牌未输出或兑换。页面显示需要服务器的一次性初始化地址。
- 浏览器文件工具拒绝读取当前 Scert 工作区内的地址文件,这是工具工作区配置问题;未绕过该限制。合法会话、数据库与 DNS 验证、管理证书配置、成员操作和布局均未执行,不能把未执行步骤记成产品故障或通过。
- 首次初始化后端专项 128 个叶子通过、0 失败、4 条平台条件跳过,退出 0;三条符号链接条件和一条 Unix 非 root 文件权限条件未满足。本批未修改产品源码、未清理业务库、未接触远端或真实 DNS。
证据、命令和边界见支持矩阵第二十五节。总清单、执行清单与相关规格已同步,不升级 44 项总状态。
## 历史项目入口与成员页面复核(2026-09-28 19:54)
可见项目和成员页面已实现。前端最终 198 项通过、0 失败、0 跳过,生产构建成功;首轮导航数量与组件注册的三处测试失败已修复并保留日志。最后新增缓存保护后重新构建产品程序并重跑,后端专项 83 个叶子通过、4 条外部 MySQL 条件跳过,完整后端 1700 个叶子通过、54 条条件跳过;静态检查、模块校验及双平台构建退出码均为 0。MySQL 5.7/8.0 三轮成员和目录组合各 195 个叶子通过、0 失败、0 跳过,含 SQLite 用例。
本批三轮专项竞态 249 个叶子通过、0 失败、12 条外部 MySQL 条件跳过,退出码 0,不称全仓库或实库竞态通过;最终证据、命令和候选哈希集中在支持矩阵第二十四节。未进行真实浏览器、远端或生产部署验收,不以模板渲染、条件跳过或 Linux 交叉构建替代实机。下方历史批次只证明各自当时源码,不覆盖当前结果。
> 最新成员接口批次(2026-09-28 19:10):首轮审计触发器失败被误映射为 409,原失败日志保留;修复后增加 DELETE 输入拒绝、认证后撤权/停用、取消请求审计、审计存储故障和三驱动错误分类正式测试。专项 62 个叶子通过、3 条实库条件跳过;MySQL 5.7/8.0 三轮各 171 个叶子通过且无失败跳过,包含 SQLite 用例;完整后端 1679 个叶子通过、53 条条件跳过,静态检查、模块校验和双平台构建通过。成员三轮竞态 186 个叶子通过、9 条外部 MySQL 条件跳过,退出码 0;完整证据见支持矩阵第二十三节,不复用下方历史竞态数字。本批没有浏览器或远端部署验收。
> 最终候选结果同步(2026-09-28 18:36):完整后端 1635 个叶子通过、52 条条件跳过;MySQL 5.7/8.0 三轮组合各 531 个叶子通过且无失败跳过(包含 SQLite 用例);最后源码取消查询/WAL 专项共 30 个叶子通过,服务并发关闭另 30 次通过;最终三轮竞态 831 个叶子通过、15 条条件跳过。上述进程退出码均为 0。Windows 独立程序历史备份/升级/成员恢复、静态检查、模块校验及双平台构建通过,完整证据见支持矩阵第二十二节。旧索引异常根因仍未关闭,跳过与交叉构建不作为实机验收通过。
> 2026-09-28 运行时与迁移批次:SQLite 取消查询遗留文件占用在旧驱动复现;v1.40.1 中间候选专项和完整后端曾通过,但其 3.50.4 引擎仍处于官方 WAL-reset 缺陷影响范围,不能作为最终放行。当前改用 v1.59.0/3.53.4,并新增 WAL 并发事务持久化完整性回归。MySQL 两次资源分配失败已核实,旧索引异常仍未关闭。最终候选执行结果、命令和未覆盖范围见支持矩阵第二十二节;历史失败日志完整保留,不称生产验收通过。
> 2026-09-28 项目成员批次:模式 14 已增加六类项目角色、实时判权和原子变更。复现并修复 SQLite 负行号误拒绝、扩展唯一索引替换绕过、空邮箱误当唯一冲突三个边界,保留失败日志;最后修复后完整后端 1623 个叶子通过、51 项条件跳过,三次竞态共 633 个叶子通过,MySQL 双版本各 242 个叶子通过且无跳过(含 SQLite 用例),Windows 独立成员备份恢复通过。最新证据为支持矩阵第二十一节的 `*-verified.jsonl`;旧 `*-final.jsonl` 不代表最后修复后的代码。本批未运行浏览器或生产环境;项目 Web/API 与任务重新判权仍未接入,不宣称完成 P0-07。下方模式 13 为上一批历史记录。
> 当前批次:模式 13 任务/审计关联及身份来源复核。审计新增身份初版存在新登录漏记、携带旧 Cookie 时错记、更新自身账户后会话失效导致漏记的问题,已用正式回归复现并修复;不缓存权限,不恢复失效会话。首轮测试夹具问题与过严断言也分别保留原日志。本批最终证据及限制见支持矩阵第二十节,不能复用下方模式 12 的数字替代本批验证。
> 最新复核:资源归属实现已提交为 `7284958`,上一批最终日志重新统计为后端 1432 个叶子通过、47 项条件跳过。本轮正式用例复现 SQLite 在关闭递归触发器时的 20 个替换绕过失败,新增第 12 号迁移修复,包含主键/隐藏行号及项目替换。失败证据保留于 `artifacts/resource-replacement-20260928/before.jsonl`,回归、干净构建和数据库专项最终以支持矩阵第十九节为准。下方根实体批次为历史记录;不宣称项目授权或生产验收完成。
> 2026 年 9 月 28 日最新批次:新增项目根实体、三库第 10 号迁移及仓储。最终后端 1409 个叶子通过、含父项 1535 条、0 失败、46 项条件跳过;54 个项目/迁移叶子用例连续 3 次竞态检测通过;MySQL 5.7.44/8.0.45 各 8 个叶子用例实库通过。独立 Windows 产品程序完成旧库升级及含普通项目的数据备份恢复。MySQL 8.0 首轮故障注入受触发器权限限制,已改用隔离管理连接注入并重测通过,没有降低安全配置或提高产品账号权限。证据见支持矩阵第十八节;项目资源字段和权限隔离仍未实现,生产未放行。
> 2026-09-27 证据索引:当前 44 项整改的逐项范围、命令、实机步骤和复审字段见《整改任务规格与验收约定》及四份分级规格;实际进展以《Scert整改任务执行清单》为准。本文历史结果须按当时源码与环境解释。
> 本批进度(源码 `fd2810b`):P0-05 `[~]`。修复 SQLite 历史模式带任务数据升级时的非固定默认值加列失败,保留业务数据、索引、视图、触发器和外键关联,并验证失败回滚及重试。SQLite 专项 71 个叶子用例通过,27 个升级/恢复用例连续 3 次竞态检测通过。后端全量 1384 条叶子通过记录、含父项 1509 条,0 失败、43 项条件跳过;vet、模块校验及 Linux 数据库/CLI 测试包交叉编译通过。独立 Windows 产品程序实际执行历史模式备份、升级和恢复;证据见支持矩阵第十七节。不是旧发行包实际数据升级、完整发行包安装、真实服务重启、Linux 原生运行或生产验收。
> 2026-09-27 范围调整:以下为历史审查证据。当前正式测试范围仅为 Web 和 Windows/Linux 服务端;历史桌面模块测试记录保留,但不再作为交付目标或生产门禁。当前任务状态见《Scert整改任务执行清单》。
## 一、范围与需求确认
日期:2026-09-15。本轮从北京时间 20:47 开始,承接“全面审查、测试、优化”的要求。
本轮按既有需求执行,不扩大测试授权:
- 保留多用户;新安装优先阿里云,既有服务商配置保持兼容。
- 管理部署环境为 `47.108.78.12`;`8.137.23.95` 仅作为推送测试目标,不能混用。
- 禁止修改 `pcux.cn` 及其子域的 DNS、证书、私钥和站点;不重载共享 Nginx。
- 自动化测试使用各自隔离的临时数据,不清空现有业务数据库。
- 不调用真实 RAM API,不执行全局域名发现,不把历史可见范围当成当前可写授权。
- 不删除已有构建、补丁、工作区文件,不把含凭据的辅助脚本加入 Git。
- 中文文件通过补丁修改;分阶段中文提交、显式暂存、推送并验证。
## 二、任务清单
| 状态 | 任务 |
| --- | --- |
| `[✓]` | 恢复任务、核对工作区及两台主机边界 |
| `[✓]` | 桌面模块同步后端 SSH 安全依赖,恢复只读模块测试 |
| `[✓]` | 认证和初始化跨源写请求防护及回归 |
| `[✓]` | 同步长操作的有限上下文、响应期限及真实套接字回归 |
| `[✓]` | 初始化锁粒度优化及并发提交回归 |
| `[✓]` | 前端 DNS 旧响应、输入失效、过期令牌和卸载竞态修复 |
| `[✓]` | 续期及阿里云报告嵌套错误脱敏 |
| `[✓]` | 认证状态容量、过期回收、并发退出补强及最终全量复核 |
| `[✓]` | 默认阿里云与最小权限提示优化;前端 12 项测试通过 |
| `[✓]` | 最终全量测试、竞态检测、静态检查及漏洞复扫 |
| `[✓]` | 源码提交推送、远程 HEAD 核对、独立干净副本依赖安装及前端测试 |
| `[!]` | 最新 Linux 发布包:PowerShell 执行策略拒绝发布脚本,未生成新归档 |
| `[!]` | 实际浏览器页面验收:本地服务启动被执行策略拒绝,未绕过 |
| `[!]` | 真实初始化、正式 ACME、受控业务推送及生产准入 |
## 三、复现与修复
### 1. 跨源登录、退出与初始化写入
原登录与退出接受跨源 `Origin` 或 `Referer`,并允许 `text/plain` 携带 JSON。跨源回归在修复前返回 200。仅限制初始化请求来自回环地址,也不能替代浏览器来源校验。
登录、退出、初始化提交和初始化 DNS 测试加入来源中间件;跨源返回 403,不设置或清除 Cookie,也不删除已有会话。同源和无来源头的既有 CLI/API 访问保持兼容。
### 2. 长操作完成后客户端却读到 EOF
普通 HTTP 写期限为 30 秒,而 DNS 等待和证书工作流明显更长。使用真实回环套接字,把普通写期限缩短为 50 毫秒、模拟 DNS 工作流延迟 150 毫秒,原实现稳定出现 EOF。
增加按路由配置的长操作中间件:DNS 使用其验证期限,证书操作上限 30 分钟,初始化外层 12 分钟。通过 `ResponseController` 调整响应写期限,并留出 2 分钟处理清理、回滚和结果序列化。普通请求的超时保护不变。新增取消后的明确响应测试。
**反向代理仍必须单独设置足够的读响应期限**。服务器放宽写期限不会自动改变 Nginx、负载均衡或客户端超时;本轮未修改远程代理配置。
### 3. 初始化阻塞所有配置读取
初始化原来在证书签发期间持续持有配置写锁。改为专用初始化互斥锁,加上开始和结束时的短配置锁。并发初始化返回 409;在模拟签发阻塞期间,状态请求仍可返回。
### 4. DNS 输入与旧响应串线
初始化及系统设置存在旧请求覆盖新输入、新结果的问题;系统设置对过期令牌和新增凭据检查不足。最初六个新增测试在修复前失败。
采用请求代次与同步输入监听,只有当前代次可更新结果、错误和加载状态。输入变化、关闭设置、组件卸载均使在途结果失效。新增配置必须有未过期的服务端验证令牌;未修改已保存 DNS 配置时仍可保存其他设置。
测试直接运行真实 Vue 组合式逻辑、监听和生命周期,模拟网络,不引入新 npm 依赖。**这些测试不是页面渲染或真实云 API 验收。**
### 5. 嵌套错误泄露
原 `RenewalReport.Errors`、阿里云报告 `Diagnosis` 和逐域 `Error` 能把底层错误带回客户端。新增哨兵错误测试在修复前失败。
保留失败数量、域名及写入和清理状态,返回安全中文诊断;未知 SDK 错误、受保护凭据读取错误不再直接拼接到响应。写入成功但清理失败仍明确显示 `writable=true`、`cleanup=false`、`verified=false`,不把脱敏误做成成功。
### 6. 登录状态长期增长和并发退出
三个新测试证明:过期且不再访问的会话未清理;随机账号可持续增加限流表;大体积账号输入直接留在限流键中。
改为:
- 新登录前回收过期会话,认证会话和失败登录表各设 4096 项上限。
- 限流表按请求触发、至少间隔一分钟回收过期项,不提前解除有效封禁。
- 账号规范化后散列为固定长度键,避免存储整段大输入。
- 会话表满时返回 503,不踢出有效用户;限流表满时未知键返回 429,不能悄悄绕过限制。
- 用户校验返回后再次检查会话存在性,避免已经完成的退出被旧刷新请求继续使用。
- 增加会话容量恢复和暂停账号查询期间并发退出的回归。
容量上限是内存保护,不是完整抗攻击方案。高并发认证、全局容量耗尽时正常用户可用性,以及可信代理下的来源限流,还需独立负载与攻击流量验收。
### 7. 阿里云入口与提示
全新初始化默认 `aliyun`,已保存的服务商仍保留。权限拒绝提示不再建议直接授予 `Action: alidns:*`,而是核对实际托管区并按失败动作补充必要权限,不扩大至所有域名。
这不代表整个产品已完成阿里云专用化。其他服务商的 UI 和兼容实现未删除。
## 四、已收取的验证证据
- 第一阶段后端全量测试、全量竞态检测、`go vet` 和模块校验通过;语句覆盖率 63.9%。
- 桌面模块依赖原来在 `-mod=readonly` 下要求更新;同步 `golang.org/x/crypto v0.56.0` 后测试、静态检查、模块校验通过。
- 后端、桌面漏洞扫描均为零调用可达漏洞、零已导入受影响包。模块层仍提示 `GO-2026-5932`:未使用的 `golang.org/x/crypto/openpgp` 包,无修复版本。不能写成“依赖树完全无漏洞提示”。
- 第二阶段认证及 DNS 包测试通过,新增容量及并发测试纳入最终全量复跑。
- 前端最终 `npm test` 为 12/12,通过全依赖及生产依赖审计,均零漏洞。
- 最新产品前端生产构建通过,输出到全新 `.runtime/review-20260915-2115/install/web`,未覆盖旧产物。
- Linux 安装脚本 `bash -n`、Windows 安装脚本 PowerShell 语法解析通过;未执行安装器。
- 本地服务后台启动调用被执行策略拒绝。没有换启动方式绕过,没有继续启动浏览器,没有本轮实际页面截图或页面验收结论。
21:23 收取最终后端复跑:全量测试、全量竞态检测、`go vet`、`go mod verify`、漏洞复扫均退出零。最终语句覆盖率 **64.0%**,HTTP 包 **70.6%**。桌面模块针对最新后端的只读模块测试、静态检查、模块校验也全部通过。
中间一次容量测试误用了“必须登录成功”的旧测试辅助函数,把预期 503 当作失败;已改为直接发 HTTP 请求断言 503,再验证过期回收后登录恢复。最终结果来自修正后完整重跑,不使用失败运行的覆盖率文件。
候选提交与发布包结果在本文件末尾追加,以最后一次成功记录为准。
## 五、仍需整改和生产验收的项目
### 发布阻塞
1. **阿里云写探测授权边界**:`AliyunAuthorizationChecker.Verify` 仍会从目标向父级候选逐级试写。应由用户明确托管区与允许操作范围,任何父区或公共后缀都不能因自动推断而获得操作授权。现有只读 `Inspect` 已是精确托管区模式,但不等于写路径已整改。
2. **当前管理环境未完成初始化和正式 TLS**:上轮文档记载 `/readyz=503 setup_incomplete`,正式 ACME 连接超时。本轮没有远程刷新,不能当作已解决或确认当前仍然如此。
3. **新代码未实机安装验收**:需要维护窗口、完整备份、受控升级、真实初始化、浏览器 HTTPS/SNI、正式证书链及回滚演练。
4. **真实业务推送未验收**:隔离 SSH/SFTP 事务测试不等于已有业务服务的实际证书读取、配置校验和授权 reload;`pcux.cn` 禁止修改仍然有效。
### 后续安全与质量工作
- 会话有效性校验对缺少 `UserID` 或 `PasswordHash` 的内部会话仍有兼容分支;真实登录会填写这两项,多个旧测试直接注入不完整会话。应先改测试夹具,再使生产分支严格失败关闭,不能把其当前状态称作完整认证审计通过。
- 长请求需要反向代理和实际客户端超时验证;后续宜评估异步任务接口,而不是继续提高所有请求的全局超时。
- 多用户、高并发、容量饱和与长时间运行尚未压力验收。
- Windows Service、Wails 安装包、ACL、MySQL 和真实防火墙链路需要各自目标平台验收。
## 六、结论
本轮完成了多项可复现缺陷修复和自动化回归,提升了发布候选质量;**不构成“全部开发完成”或“生产验收通过”**。尤其是用户强调的部分域名授权边界,应作为正式写入和生产准入前的优先整改项,而不是用全量测试通过替代。
## 七、最终交付与执行阻塞
21:25 左右完成以下复核:
| 项目 | 结果 |
| --- | --- |
| 第一阶段安全修复提交 | `00ea12cbd99900626b15870131869a10c3049d2c`,已推送 |
| 最新产品源码提交 | `667f76924e6d2cb4646ad7207768664c03b95d54`,已推送且远程 HEAD 一致 |
| 独立源码副本 | 系统临时目录 `scert-review-source-667f769-2125`,全新 Git 克隆,工作区干净 |
| 副本依赖及测试 | `npm ci`、`npm test` 通过,12/12,依赖审计零漏洞 |
| 最新 Linux 发布归档 | 未生成,不能提供或编造新归档 SHA256 |
| 远程部署 | 本轮未连接两台远程主机、未安装本轮代码 |
| 本地浏览器服务 | 启动被执行策略拒绝;复核 15200、15201 均无监听 |
| 原文件及旧产物 | 均保留,没有清空业务数据库或删除用户文件 |
发布脚本在独立副本中正常调用时,被 PowerShell 拒绝,错误为 `PSSecurityException / UnauthorizedAccess`,提示系统禁止运行脚本。没有改执行策略,没有设置 `ExecutionPolicy Bypass`,没有读取脚本文本重新执行或改写调用方式绕过保护。
本地服务启动调用被工具执行策略拒绝,与发布脚本的 PowerShell 策略错误是两个独立阻塞,不能声称只解决其中一个就可以完成页面与打包验收。独立副本 `npm ci` 还提示 `esbuild` 安装脚本未列入允许项;当前依赖安装和前端测试通过,但后续实际发布构建仍需按环境规范核对,不为消除告警自动扩大执行权限。
此前保留的 Linux 候选来自旧提交,不包含本轮修复。恢复发布流程后必须从上表源码提交或后续经过完整验证的新提交重新构建,检查 `source_dirty=false`、内嵌 VCS 信息、归档成员、完整校验清单和哈希,再安排受控实机验收。