名称: 安全门控 描述: 在合并或部署前验证安全性,包括OWASP Top 10、输入验证和认证检查。警告:在/own:done流程中触发门控。
门控2:安全审查
“安全不是后来添加的功能。它是你构建的基础。”
目的
此门控在常见安全漏洞进入生产环境前捕获它们。问题不会阻塞,但会产生强烈警告。
门控状态
- 通过 — 未发现安全问题
- 警告 — 发现应在生产前修复的问题
- 严重警告 — 严重问题,确实应阻塞
门控问题
问题1:输入入口点
“用户输入从哪里进入此功能?”
寻找:
- 对所有输入源的意识(表单、URL、头信息等)
- 理解所有输入都是不可信任的
- 数据流的识别
如果有输入存在,跟进:
“在使用前如何验证该输入?”
问题2:数据访问
“此功能访问什么数据?谁应该能够访问它?”
寻找:
- 对数据敏感性的理解
- 对授权要求的意识
- 谁知道能看什么的知识
跟进:
“如何验证请求用户被允许访问此数据?”
问题3:秘密和暴露
“是否有任何秘密、令牌或敏感数据涉及?它们存储在哪里?”
寻找:
- 秘密在环境变量中,不在代码中
- 日志中无敏感数据
- URL或客户端存储中无令牌(除非必要)
安全检查清单
审查代码以查找这些常见问题:
输入处理
- [ ] 所有用户输入在服务器端验证
- [ ] 强制执行输入长度限制
- [ ] 处理特殊字符(SQL、HTML、shell)
- [ ] 验证文件上传(类型、大小、内容)
认证和授权
- [ ] 受保护路由需要认证
- [ ] 用户只能访问自己的数据
- [ ] 管理员路由检查管理员角色
- [ ] 令牌具有合理的过期时间
数据暴露
- [ ] API响应不包含不必要的字段
- [ ] 错误不暴露内部细节
- [ ] 日志不包含密码/令牌
- [ ] URL中无敏感数据
常见漏洞
- [ ] 无SQL字符串连接
- [ ] 无
eval()或new Function()与用户输入 - [ ] 无
innerHTML与未净化的用户输入 - [ ] 无硬编码秘密在代码中
响应模板
如果通过
✅ 安全门控:通过
已解决的安全考虑:
- 输入验证:✓
- 授权检查:✓
- 无暴露秘密:✓
移动到下一个门控...
如果警告
⚠️ 安全门控:警告
我发现了[X]个需要解决的安全考虑:
**问题1:[标题]**
位置:`file.ts:42`
风险:[可能出错的情况]
问题:"什么阻止恶意用户从[攻击场景]?"
**问题2:[标题]**
位置:`file.ts:88`
风险:[可能出错的情况]
建议:[修复方向,非答案]
这些应在进入生产前修复。
你想现在解决它们吗?
如果严重警告
🚨 安全门控:严重警告
这需要在进行前注意:
**严重:[问题]**
位置:`file.ts:42`
风险:[严重性解释 - 数据泄露、账户接管等]
这种漏洞是那种会上新闻头条的。
让我们在继续之前修复它。
常见漏洞检查
SQL注入
❌ db.query(`SELECT * FROM users WHERE id = ${userId}`);
✅ db.query('SELECT * FROM users WHERE id = ?', [userId]);
跨站脚本(XSS)
❌ element.innerHTML = userInput;
✅ element.textContent = userInput;
不安全的直接对象引用(IDOR)
❌ // 任何人都可以访问任何用户的数据
app.get('/users/:id', (req, res) => {
const user = await User.findById(req.params.id);
res.json(user);
});
✅ // 检查所有权
app.get('/users/:id', (req, res) => {
const user = await User.findById(req.params.id);
if (user.id !== req.user.id) throw new ForbiddenError();
res.json(user);
});
硬编码秘密
❌ const apiKey = 'sk-live-abc123';
✅ const apiKey = process.env.API_KEY;
苏格拉底式安全问题
而不是指出修复,问:
- “什么阻止用户A通过更改ID访问用户B的数据?”
- “如果我发送
<script>alert('XSS')</script>作为我的名字,会发生什么?” - “如果有人向此端点发送10MB的数据怎么办?”
- “如果我克隆此仓库,我会看到什么秘密?”
- “如果有人猜测另一个用户的令牌会发生什么?”
风险级别指南
| 问题 | 风险级别 | 行动 |
|---|---|---|
| SQL注入可能 | 严重 | 必须修复 |
| 认证上无速率限制 | 高 | 应修复 |
| 缺少授权检查 | 高 | 应修复 |
| XSS可能 | 高 | 应修复 |
| 详细错误消息 | 中 | 建议修复 |
| 缺少输入验证 | 中 | 建议修复 |
| 无CSRF保护 | 中 | 建议修复 |
| CORS太宽松 | 低 | 注意审查 |