解释 API 特有的 10 个最关键的安全风险以及如何降低这些风险。
OWASP(开放式全球应用安全项目)发布的 API 特定安全风险排名。2023 年版提供了最新的列表,反映了随着 API 的广泛采用而增加的威胁。
通过操纵对象 ID 允许未经授权访问其他用户数据的漏洞。它被称为最常出现、最容易被利用的漏洞。
攻击者只需更改 URL 或请求参数中的 ID,就能访问其他用户的个人信息、支付详情、订单历史记录等。
// 接收 ID 并直接返回数据--无需授权检查 app.get('/api/users/:id/orders', async (req, res) => { const orders = await Order.find({ userId: req.params.id }); res.json(orders); });
// 与已通过身份验证的用户 ID 进行验证,以进行授权检查 app.get('/api/users/:id/orders', authenticate, async (req, res) => { if (req.user.id !== req.params.id && !req.user.isAdmin) { return res.status(403).json({ error: 'Forbidden' }); } const orders = await Order.find({ userId: req.params.id }); res.json(orders); });
由于身份验证机制实施存在缺陷,攻击者可利用该漏洞接管合法用户账户。
密码策略薄弱、令牌管理不当、缺乏暴力破解保护、会话管理不足等等。
const jwt = require('jsonwebtoken'); function authenticate(req, res, next) { const token = req.headers.authorization?.split(' ')[1]; if (!token) return res.status(401).json({ error: 'Token required' }); try { // 明确指定算法(防止算法:无攻击) const decoded = jwt.verify(token, process.env.JWT_SECRET, { algorithms: ['HS256'], issuer: 'your-app', }); req.user = decoded; next(); } catch (err) { res.status(401).json({ error: 'Invalid token' }); } }
对 API 响应中包含的对象属性(字段)的访问控制不充分的漏洞。此项目结合了过度数据暴露和大规模分配。
// 仅返回用户对象的公共字段 function sanitizeUser(user, requesterId) { const publicFields = { id: user.id, name: user.name, avatar: user.avatar }; // 只有所有者可以查看附加字段 if (requesterId === user.id) { publicFields.email = user.email; publicFields.phone = user.phone; } return publicFields; // ❌ 返回用户;会泄露 password_hash 等信息。 }
对 API 请求大小、频率或资源消耗没有限制,导致 DoS 攻击或成本激增的漏洞。
const rateLimit = require('express-rate-limit'); // 全局速率限制 app.use(rateLimit({ windowMs: 15 * 60 * 1000, // 15 分钟 max: 100, // 最多 100 个请求 standardHeaders: true, })); // 有效载荷大小限制 app.use(express.json({ limit: '10kb' })); // 分页上限 app.get('/api/items', (req, res) => { const limit = Math.min(parseInt(req.query.limit) || 20, 100); // ... });
在此漏洞中,未对管理功能和终端实施适当的访问控制,从而允许普通用户执行管理操作。
function authorize(...roles) { return (req, res, next) => { if (!roles.includes(req.user.role)) { return res.status(403).json({ error: 'Insufficient permissions' }); } next(); }; } // 仅限管理员访问 app.delete('/api/admin/users/:id', authenticate, authorize('admin'), deleteUser); // 管理员兼版主 app.put('/api/posts/:id/moderate', authenticate, authorize('admin', 'moderator'), moderatePost);
关键业务逻辑流不受自动攻击保护的漏洞。例如:倒卖机票、大量获取优惠券、发布垃圾邮件等。
服务器在未验证的情况下获取用户提供的 URL,从而导致未经授权访问内部网络的漏洞。
const { URL } = require('url'); function isAllowedUrl(input) { try { const url = new URL(input); // 限制协议 if (!['https:', 'http:'].includes(url.protocol)) return false; // 封锁私有 IP 范围 const blocked = ['127.0.0.1', 'localhost', '0.0.0.0', '169.254.169.254']; if (blocked.includes(url.hostname)) return false; // 检查内部网络范围(10.x、172.16-31.x、192.168.x) if (/^(10\.|172\.(1[6-9]|2\d|3[01])\.|192\.168\.)/.test(url.hostname)) return false; return true; } catch { return false; } }
API 服务器或框架的安全设置不当。包括允许不必要的 HTTP 方法、过度放任的 CORS 策略、暴露调试信息等。
const helmet = require('helmet'); const cors = require('cors'); app.use(helmet()); app.use(cors({ origin: ['https://app.example.com'], // 不要使用通配符 methods: ['GET', 'POST', 'PUT', 'DELETE'], credentials: true, })); // 错误处理器:在生产过程中不返回堆栈跟踪 app.use((err, req, res, next) => { res.status(500).json({ error: process.env.NODE_ENV === 'production' ? 'Internal Server Error' : err.message, }); });
在未应用安全补丁的情况下,旧版 API 端点处于暴露状态。也称为影子 API 或僵尸 API。
这是一个未经验证就信任第三方 API 响应的漏洞。如果外部应用程序接口被入侵,其影响会传播到您自己的系统。
const Ajv = require('ajv'); const ajv = new Ajv(); // 使用模式验证外部应用程序接口响应 const externalSchema = { type: 'object', required: ['id', 'status'], properties: { id: { type: 'string', maxLength: 50 }, status: { type: 'string', enum: ['active', 'inactive'] }, }, additionalProperties: false, }; const validate = ajv.compile(externalSchema); async function fetchExternalData() { const res = await fetch('https://api.external.com/data'); const data = await res.json(); if (!validate(data)) { throw new Error('External API response validation failed'); } return data; }
| 身份证 | 脆弱性 | 严重性 | 关键缓解措施 |
|---|---|---|---|
| API1 | Broken Object Level Authorization | Critical | 对象级授权检查 |
| API2 | Broken Authentication | Critical | 适当的令牌管理和暴力保护 |
| API3 | Broken Object Property Level Authorization | High | 显式响应字段过滤 |
| API4 | Unrestricted Resource Consumption | High | 速率限制和有效载荷大小限制 |
| API5 | Broken Function Level Authorization | High | 基于角色的访问控制 |
| API6 | Unrestricted Access to Sensitive Business Flows | Medium | 验证码和企业级费率限制 |
| API7 | Server Side Request Forgery | High | URL 验证和私人 IP 阻断 |
| API8 | Security Misconfiguration | Medium | 安全标头和 CORS 配置 |
| API9 | Improper Inventory Management | Medium | 应用程序接口库存管理和报废政策 |
| API10 | Unsafe Consumption of APIs | Medium | 外部应用程序接口响应的模式验证 |