From f7f5428812191aea173d94ad4c59808365d59a06 Mon Sep 17 00:00:00 2001 From: John Qiu Date: Sat, 14 Mar 2026 08:12:41 +1030 Subject: [PATCH] =?UTF-8?q?feat(req):=20=E4=BB=A3=E7=A0=81=E8=AF=84?= =?UTF-8?q?=E5=AE=A1=E5=A2=9E=E5=8A=A0=E4=BA=94=E8=A7=86=E8=A7=92=E6=89=AB?= =?UTF-8?q?=E6=8F=8F=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CR 从"Git diff + 检查清单"升级为结构化的五视角对抗性审查: - 攻击者:跨租户泄露、越权、注入 - 泄露者:错误消息/日志/响应信息泄露 - 并发者:竞态、幂等、锁粒度 - 边界者:参数校验、类型溢出 - 依赖者:超时、降级、token 区分 每个视角配具体扫描 checklist,CR 报告模板增加五视角分节, /req cr 流程从 1 行扩展为 8 步完整链路。 Co-Authored-By: Claude Opus 4.6 --- plugins/req-plugin/skills/SKILL.md | 84 +++++++++++++++++++++++++++--- 1 file changed, 77 insertions(+), 7 deletions(-) diff --git a/plugins/req-plugin/skills/SKILL.md b/plugins/req-plugin/skills/SKILL.md index 2f941d0..c89af20 100644 --- a/plugins/req-plugin/skills/SKILL.md +++ b/plugins/req-plugin/skills/SKILL.md @@ -125,13 +125,53 @@ Gate 4: 完整性检查 ── 三段式完整 + 验收标准 ≥ 2 条 + PRD | 离开阶段 | 检查标准 | |----------|---------| -| **review** | CR 任务有文档,字数 ≥ 500,含 `file:line` 代码引用,含结论章节 | +| **review** | CR 任务有文档,字数 ≥ 500,含 `file:line` 代码引用,含五视角扫描结果,含结论章节 | | **testing** | 测试任务有文档,含测试结果表格,含通过/失败结论 | | **staging** | 部署任务有文档,含健康检查结果 | 未通过 → AskUserQuestion(补充文档 or 强制跳过+记录原因) -### CR 报告最低模板 +### CR 五视角扫描法 + +**核心原则**:实现阶段关注"怎么让它跑通",评审阶段关注"怎么让它出错"。AI 必须**切换到对抗性思维**,逐一用以下 5 个视角扫描代码。 + +| 视角 | 思维模式 | 扫描问题 | +|------|---------|---------| +| **1. 攻击者** | "我怎么绕过/滥用它?" | 跨租户数据泄露、越权访问、参数注入、重放攻击 | +| **2. 泄露者** | "它暴露了什么不该暴露的?" | 错误消息泄露信息、日志记录敏感数据、响应包含内部细节 | +| **3. 并发者** | "两个请求同时来会怎样?" | 竞态条件、双重扣款、幂等性缺失、锁粒度 | +| **4. 边界者** | "极端输入会怎样?" | 空值/零值/负值/超长字符串、类型溢出、分页越界 | +| **5. 依赖者** | "外部服务挂了会怎样?" | 超时处理、重试策略、降级方案、连接泄露 | + +**每个视角的具体扫描清单**: + +#### 视角1: 攻击者(多租户安全) +- [ ] 所有 Store 层查询是否带 `tenant_id` 过滤?(特别是通过 ID 直接查询的方法) +- [ ] 用户只能操作自己的数据?(consumer_id 校验) +- [ ] URL/请求参数是否有注入风险?(SQL、URL、命令注入) +- [ ] 外部输入是否直接拼接到查询/URL?(应使用参数化查询或编码) + +#### 视角2: 泄露者(信息安全) +- [ ] 错误消息是否泄露业务状态?(如"手机号未注册"暴露用户存在性) +- [ ] 日志是否打印了密码、token、密钥? +- [ ] 响应是否包含不必要的内部字段?(如内部 ID、数据库字段名) + +#### 视角3: 并发者(数据一致性) +- [ ] 涉及金额变更是否使用事务 + 悲观锁? +- [ ] 关键操作是否有幂等保护?(bizNo 唯一索引) +- [ ] 全局状态(如进程内计数器)重启后是否安全? + +#### 视角4: 边界者(健壮性) +- [ ] 必填参数是否有 binding:"required" 校验? +- [ ] 数值参数是否有范围校验?(min/max) +- [ ] 分页参数是否有默认值和上限? + +#### 视角5: 依赖者(可靠性) +- [ ] HTTP 客户端是否设置超时? +- [ ] 外部 API 调用失败是否有合理的错误处理? +- [ ] token 类型是否可区分?(access vs refresh 不同过期策略) + +### CR 报告模板 ```markdown ## 代码评审报告 - {需求标题} @@ -141,10 +181,32 @@ Gate 4: 完整性检查 ── 三段式完整 + 验收标准 ≥ 2 条 + PRD ### 变更概要 {1-3 句描述} -### 审查发现 -| 严重度 | 文件:行号 | 描述 | 建议 | -|--------|----------|------|------| -| {Critical/High/Medium/Low} | {file:line} | {问题} | {建议} | +### 五视角扫描结果 + +#### 1. 攻击者视角 +{扫描发现,或 "未发现问题"} + +#### 2. 泄露者视角 +{扫描发现,或 "未发现问题"} + +#### 3. 并发者视角 +{扫描发现,或 "未发现问题"} + +#### 4. 边界者视角 +{扫描发现,或 "未发现问题"} + +#### 5. 依赖者视角 +{扫描发现,或 "未发现问题"} + +### 审查发现汇总 +| 严重度 | 文件:行号 | 视角 | 描述 | 建议 | +|--------|----------|------|------|------| +| {Critical/High/Medium/Low} | {file:line} | {攻击者/泄露者/...} | {问题} | {建议} | + +### 测试覆盖 +| 测试类型 | 数量 | 状态 | +|----------|------|------| +| ... | ... | ... | ### 结论 {通过 / 有条件通过 / 需修改} @@ -207,7 +269,15 @@ Gate 4: 完整性检查 ── 三段式完整 + 验收标准 ≥ 2 条 + PRD 2. `ai-proj task start --id ` 更新任务状态为开发中 3. `/pr start` 从 origin/main 建分支 -**`/req cr [REQ-ID]`** — 代码评审:Git diff 摘要 + 生成检查清单(前置:开发任务完成) +**`/req cr [REQ-ID]`** — 代码评审(前置:开发任务完成): +1. `ai-proj req tasks --id ` 确认所有 implementation 任务已完成 +2. `git diff` / `find` 确定变更范围(文件数、行数) +3. 读取所有变更文件源码(非 test 文件) +4. **五视角扫描**:逐一用攻击者/泄露者/并发者/边界者/依赖者视角审查 +5. `ai-proj task create` 创建【代码评审】任务并关联需求(linkRole=code_review) +6. `ai-proj create-and-attach` 附加 CR 报告文档(必须含五视角扫描结果) +7. 展示发现摘要,AskUserQuestion 确认是否创建 bug 修复任务 +8. 若有 High/Critical 发现 → `ai-proj task create` 创建关联修复任务 **`/req test [REQ-ID]`** — 测试(前置:代码评审通过),遵循 dev-test 技能的 5-Gate 流程