什么是 OWASP API 安全 Top 10?

OWASP(开放式全球应用安全项目)发布的 API 特定安全风险排名。2023 年版提供了最新的列表,反映了随着 API 的广泛采用而增加的威胁。

1️⃣ API1:2023 - 破碎对象级授权(BOLA)

Critical

概述

通过操纵对象 ID 允许未经授权访问其他用户数据的漏洞。它被称为最常出现、最容易被利用的漏洞。

风险

攻击者只需更改 URL 或请求参数中的 ID,就能访问其他用户的个人信息、支付详情、订单历史记录等。

漏洞代码示例

JavaScript (Express) ❌ Bad
// 接收 ID 并直接返回数据--无需授权检查
app.get('/api/users/:id/orders', async (req, res) => {
  const orders = await Order.find({ userId: req.params.id });
  res.json(orders);
});

安全代码示例

JavaScript (Express) ✅ Good
// 与已通过身份验证的用户 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);
});

缓解措施清单

2️⃣ API2:2023 - 验证失败

Critical

概述

由于身份验证机制实施存在缺陷,攻击者可利用该漏洞接管合法用户账户。

常见问题

密码策略薄弱、令牌管理不当、缺乏暴力破解保护、会话管理不足等等。

JavaScript ✅ 缓解示例:JWT 验证
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' });
  }
}

3️⃣ API3:2023 - 破碎的对象属性级授权

High

概述

对 API 响应中包含的对象属性(字段)的访问控制不充分的漏洞。此项目结合了过度数据暴露和大规模分配。

JavaScript ✅ 响应滤波
// 仅返回用户对象的公共字段
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 等信息。
}

4️⃣ API4:2023 - 不受限制的资源消耗

High

概述

对 API 请求大小、频率或资源消耗没有限制,导致 DoS 攻击或成本激增的漏洞。

JavaScript (Express) ✅ 实施资源限制
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);
  // ...
});

5️⃣ API5:2023 - 功能级授权中断

High

概述

在此漏洞中,未对管理功能和终端实施适当的访问控制,从而允许普通用户执行管理操作。

JavaScript ✅ 基于角色的访问控制
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);

6️⃣ API6:2023 - 不受限制地访问敏感业务流

Medium

概述

关键业务逻辑流不受自动攻击保护的漏洞。例如:倒卖机票、大量获取优惠券、发布垃圾邮件等。

缓解措施

7️⃣ API7:2023 - 服务器端请求伪造 (SSRF)

High

概述

服务器在未验证的情况下获取用户提供的 URL,从而导致未经授权访问内部网络的漏洞。

JavaScript ✅ SSRF 缓解
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;
  }
}

8️⃣ API8:2023 - 安全配置错误

Medium

概述

API 服务器或框架的安全设置不当。包括允许不必要的 HTTP 方法、过度放任的 CORS 策略、暴露调试信息等。

JavaScript (Express) ✅ 安全头配置
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,
  });
});

9️⃣ API9:2023 - 库存管理不当

Medium

概述

在未应用安全补丁的情况下,旧版 API 端点处于暴露状态。也称为影子 API 或僵尸 API。

缓解措施

🔟 API10:2023 - 不安全使用原料药

Medium

概述

这是一个未经验证就信任第三方 API 响应的漏洞。如果外部应用程序接口被入侵,其影响会传播到您自己的系统。

JavaScript ✅ 外部 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;
}

📊 汇总表

身份证 脆弱性 严重性 关键缓解措施
API1Broken Object Level AuthorizationCritical对象级授权检查
API2Broken AuthenticationCritical适当的令牌管理和暴力保护
API3Broken Object Property Level AuthorizationHigh显式响应字段过滤
API4Unrestricted Resource ConsumptionHigh速率限制和有效载荷大小限制
API5Broken Function Level AuthorizationHigh基于角色的访问控制
API6Unrestricted Access to Sensitive Business FlowsMedium验证码和企业级费率限制
API7Server Side Request ForgeryHighURL 验证和私人 IP 阻断
API8Security MisconfigurationMedium安全标头和 CORS 配置
API9Improper Inventory ManagementMedium应用程序接口库存管理和报废政策
API10Unsafe Consumption of APIsMedium外部应用程序接口响应的模式验证