安全门控 security-gate

安全门控技能是用于在软件开发流程中自动验证安全标准的DevOps实践,确保在代码合并或部署前检测和预防常见安全漏洞,如OWASP Top 10、输入验证和认证检查问题。关键词:安全验证、DevOps、OWASP、输入验证、认证检查、安全门控。

DevOps 0 次安装 0 次浏览 更新于 3/8/2026

名称: 安全门控 描述: 在合并或部署前验证安全性,包括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;

苏格拉底式安全问题

而不是指出修复,问:

  1. “什么阻止用户A通过更改ID访问用户B的数据?”
  2. “如果我发送<script>alert('XSS')</script>作为我的名字,会发生什么?”
  3. “如果有人向此端点发送10MB的数据怎么办?”
  4. “如果我克隆此仓库,我会看到什么秘密?”
  5. “如果有人猜测另一个用户的令牌会发生什么?”

风险级别指南

问题 风险级别 行动
SQL注入可能 严重 必须修复
认证上无速率限制 应修复
缺少授权检查 应修复
XSS可能 应修复
详细错误消息 建议修复
缺少输入验证 建议修复
无CSRF保护 建议修复
CORS太宽松 注意审查