/security-review 是 /review 的专项版本。输入相同——你分支上的待合并改动——但视角不同:威胁面、敏感凭据、输入校验、鉴权检查。这些是普通审查因为要关注太多东西而容易略过的内容。
代码中的安全问题有一个特性,使它们在常规审查中格外难以发现:它们看起来并没有错。不安全的 SQL 字符串拼接能正常解析,未经鉴权的端点能编译通过、测试也通过,硬编码的 API 密钥在生产环境正常运行——直到泄漏那天。懂得该看什么的审查者能发现这些问题;而疲惫不堪、已经看了七个 PR、只想确认整体正确性的审查者则会直接略过。
通用的审查提示词会对所有方面求平均。它能发现一些安全问题,但并不稳定。专项安全审查会引导模型用特定视角扫描——"外部输入在哪里进入代码,使用前是否经过校验?"——这一转变就改变了能发现什么。同一个智能体,同一个 diff,同一份代码,结果却大不相同。
/security-review 技能正是这样的提示词。它针对分支上的待合并改动(尚未合并到基础分支的所有内容)运行,按严重程度对发现的问题进行分类,并告诉你哪些必须在发布前修复,哪些属于"要不要开个 ticket"的级别。凡是涉及公开接口、处理敏感凭据或跨信任边界传输数据的改动,在合并前都应该跑一遍。
/security-review 检查哪些类别的问题切换到你想审查的分支,在聊天面板中输入:
/security-review
智能体会对比基础分支(通常是 main)做 diff,读取每个变更文件及足够的上下文来理解改动,然后逐项检查安全清单。输出是一份结构化的问题列表,按严重程度排序。
与 /review 不同,这个命令专门忽略代码风格和大多数通用 bug——它只用一个视角审查你的改动,而不是从所有角度审查。
审查(大致)覆盖以下类别:
Math.random()。问题按严重程度标记:
不要因为不是"高"就忽视"中"级问题。现实中大多数安全事故都是从若干"中"级问题叠加开始的。
针对每个发现的问题,下一步的提示词通常是以下几种变体之一:
最后一条价值极高。修复了漏洞但没有配套测试,迟早会回归。将测试与修复绑定,能有效防止这种情况。
静态安全审查总会有误报。智能体可能看到一个 SQL 查询,看起来像字符串拼接,但实际上是通过它不认识的封装使用了参数化 API;也可能把"缺少鉴权检查"标在一个已被上层中间件保护的端点上。
如果你不认同,直接说明:"This is fine because queryWithBind is parameterized — see db/helpers.ts."智能体会修正判断。如果误报是结构性的(代码库中有一种模式让智能体反复误读),可以在 CLAUDE.md 中加一条说明:"We use queryWithBind for safe parameterized queries — it's not concatenation."
/security-review 能发现一个有用的子集——那种出现在代码中、出现在这个 diff 里、具备安全背景的细心审查者同样会发现的问题。它做不到的是:
/security-review 假设的是通用威胁;高风险系统需要专门的威胁模型。对于安全失误代价高昂的系统(支付、身份、基础设施),将 /security-review 与定期的人工审计结合使用。智能体是下限,人工是上限。