跳转到内容
Guide

OWASP API 安全 Top 10:包含修复的清单

| 12 min read

通过真实的攻击场景、具体修复和复制粘贴清单来了解所有 10 个 OWASP API 安全风险(2023 版),以供您进行安全审查。

Cybersecurity command center with multiple monitoring screens
Photo by Adi Goldstein on Unsplash

您的 API 每小时处理 10,000 个请求。 其中三个请求来自更改的攻击者 一个 order_id 参数并下载数据库中的每条客户记录。 你发现 当你的用户这样做时,在 Twitter 上发布。

OWASP API 安全 Top 10(2023 版)列出了导致大多数问题的十种风险 API 违规。 本指南通过一段解释和现实的攻击来逐步介绍每种风险 场景和具体修复。 当 botoi API 端点帮助您检测或预防风险时, 相关端点包含在工作中 curl 命令。

API1:2023 损坏的对象级授权 (BOLA)

当 API 根据对象 ID 返回数据而不检查请求是否正确时,就会发生 BOLA 用户拥有该对象。 攻击者致电 GET /api/orders/1001,获取数据,然后迭代 通过 1002, 1003, 等等。 表中的每条记录现在都已公开。 自 2019 年首届 OWASP API 安全排行榜以来,BOLA 一直位居第一大 API 风险。

攻击场景: 一款送餐应用曝光 GET /api/orders/:id。 攻击者编写一个从 1 到 100,000 的循环并下载每个订单,包括送货地址, 电话号码和付款方式详细信息。

这是易受攻击的代码:

// Vulnerable: no ownership check
app.get("/api/orders/:id", async (req, res) => {
  const order = await db.orders.findById(req.params.id);
  res.json(order); // Any user can read any order
});

这是修复方法:

// Fixed: verify the requesting user owns the resource
app.get("/api/orders/:id", async (req, res) => {
  const order = await db.orders.findById(req.params.id);

  if (!order) return res.status(404).json({ error: "Not found" });
  if (order.userId !== req.user.id) {
    return res.status(403).json({ error: "Forbidden" });
  }

  res.json(order);
});

每个接受客户端 ID 的端点都需要进行所有权检查。 没有例外。 使用 中间件或查询过滤器(例如, WHERE user_id = ?) 在数据层强制执行此操作。

API2:2023 身份验证损坏

损坏的身份验证包括弱令牌生成、缺少令牌验证、凭证填充 攻击以及接受过期或篡改令牌的端点。 攻击者以登录端点为目标 被破坏的凭据列表,或者他们从不安全的存储中窃取令牌。

攻击场景: 攻击者获取了 1000 万个电子邮件/密码对的列表 数据泄露。 他们编写了一个脚本,根据您的情况测试每一对 POST /api/login 端点。 您的 API 对登录尝试没有速率限制,因此攻击者危害了 2,000 个帐户 一个小时。

使固定: 对身份验证端点实施速率限制(每个 IP 每分钟 5 次尝试)。 敏感操作需要多重身份验证。 根据已知信息检查用户凭据 在允许创建帐户之前发生违规行为。

botoi 违规检查 API 告诉你是否 已知数据泄露中出现的电子邮件地址:

curl -s -X POST https://api.botoi.com/v1/breach/check \\
  -H "Content-Type: application/json" \\
  -d '{
    "email": "user@example.com"
  }'

回复:

{
  "success": true,
  "data": {
    "breached": true,
    "count": 3,
    "breaches": [
      { "name": "ExampleCorp", "date": "2024-01-15", "dataTypes": ["email", "password"] },
      { "name": "DataDump2023", "date": "2023-08-22", "dataTypes": ["email", "username"] },
      { "name": "LeakedDB", "date": "2022-11-03", "dataTypes": ["email", "phone"] }
    ]
  }
}

称呼 /v1/breach/check 在注册或密码重置期间。 如果电子邮件出现违规情况, 提示用户选择更强、唯一的密码并启用双因素身份验证。

API3:2023 损坏的对象属性级授权

这种风险结合了大规模分配和过度数据暴露。 当 API 发生批量分配时 将请求正文字段直接绑定到数据模型而不进行过滤。 用户发送 "role": "admin" 在配置文件更新中并获得提升的权限。 数据暴露过多 当 API 返回内部字段(数据库 ID、散列密码、管理标志)给客户端时会发生 永远不应该看到。

攻击场景: SaaS 应用程序允许用户通过以下方式更新他们的个人资料 PUT /api/users/:id。 后端接受完整的请求正文并将其写入数据库。 攻击者添加 "plan": "enterprise" 根据请求并免费使用高级功能。

使固定: 对可写字段使用显式允许列表。 切勿将原始请求数据绑定到您的 数据模型。 使用排除内部字段的单独响应 DTO。 验证每个传入的属性 在处理之前针对模式。

API4:2023 无限制的资源消耗

接受无限制请求的 API 让攻击者可以耗尽您的基础设施账单、耗尽数据库 连接,或触发拒绝服务。 这适用于缺少速率限制、无界查询 参数(例如, ?limit=1000000),没有大小上限的文件上传,以及端点 触发昂贵的后台作业。

攻击场景: API 端点生成 PDF 报告。 攻击者发送 500 并发请求,每个请求都请求 200 页的报告。 你的工人池已满,并且合法 用户在接下来的 20 分钟内收到 503 错误。

使固定: 添加每个用户和每个 IP 的速率限制。 服务器端的分页限制 最大值。 设置文件上传大小限制。 对昂贵的操作使用基于队列的处理。

// Express rate limiter per user
import rateLimit from "express-rate-limit";

const apiLimiter = rateLimit({
  windowMs: 60 * 1000, // 1 minute
  max: 30,             // 30 requests per minute per IP
  standardHeaders: true,
  legacyHeaders: false,
  message: { error: "Rate limit exceeded. Try again in 60 seconds." },
});

app.use("/api/", apiLimiter);

API5:2023 功能级授权损坏

功能级授权缺陷使普通用户可以调用管理端点。 典型模式: 管理面板调用 DELETE /api/admin/users/:id。 前端隐藏按钮 非管理员用户,但 API 端点本身不检查角色。 任何经过身份验证的用户 发现该URL可以删除帐户。

攻击场景: 一位开发商发现 /api/admin/export-all-users 在 JavaScript 包中。 他们用普通用户令牌调用它并下载完整的用户 数据库。

使固定: 检查每个管理端点的 API 层的用户角色。 不要依赖 隐藏功能的前端。 验证中间件后面的组管理路由 role === "admin" 在处理请求之前。

API6:2023 无限制访问敏感业务流程

即使每个单独的请求都获得授权,某些 API 流在规模上也是危险的。 求购 库存有限的商品、创建免费试用帐户、提交推荐代码; 这些流动 自动化时中断。 机器人注册 10,000 个免费帐户或购买闪购中的每张门票 在真实用户加载页面之前。

攻击场景: 运动鞋经销商编写了一个机器人来调用 POST /api/checkout 有限跌落第一秒内 500 次。 每双都卖 给机器人。 在页面加载完成之前,人类客户就会看到“已售完”。

使固定: 将验证码或工作证明挑战添加到高价值流程中。 轨道装置 指纹来检测自动化。 设置每个用户的购买限制。 使用基于队列的访问 限时抢购而非先到先得的端点。

API7:2023 服务器端请求伪造 (SSRF)

当 API 接受来自客户端的 URL 并在服务器端获取它而无需 验证目标。 攻击者提供 http://169.254.169.254/latest/meta-data/ 并且您的服务器返回 AWS 实例凭证。 或者他们的目标 http://localhost:6379/ 并与您的 Redis 实例交互。

攻击场景: Webhook 集成允许用户指定回调 URL。 攻击者将回调设置为 http://169.254.169.254/latest/meta-data/iam/security-credentials/ 并在 Webhook 负载中接收您的云提供商的 IAM 角色凭证。

// Block internal network requests
const BLOCKED_RANGES = [
  /^10\\./, /^172\\.(1[6-9]|2\\d|3[01])\\./, /^192\\.168\\./,
  /^127\\./, /^0\\./, /^169\\.254\\./,
  /^localhost$/i, /^\\[::1\\]$/,
];

function isSafeUrl(urlString) {
  try {
    const url = new URL(urlString);
    const hostname = url.hostname;
    return !BLOCKED_RANGES.some((re) => re.test(hostname));
  } catch {
    return false;
  }
}

app.post("/api/fetch-url", async (req, res) => {
  const { url } = req.body;
  if (!isSafeUrl(url)) {
    return res.status(400).json({ error: "URL targets a blocked network range" });
  }
  // proceed with external fetch
});

使固定: 验证目标 URL 并将其列入白名单。 阻止私有 IP 范围和云 元数据端点。 在发出请求之前解析 DNS,以防止 DNS 重新绑定。 运行出站 来自隔离网段的请求。

API8:2023 安全配置错误

配置错误是最广泛的风险类别。 它包括缺少 CORS 限制、详细错误 泄漏堆栈跟踪的消息、管理面板上的默认凭据、启用不必要的 HTTP 方法、 未强制执行 TLS,并且缺少安全标头。 任何单一的错误配置都会创建一个入口点。

攻击场景: API 在生产错误响应中返回完整的堆栈跟踪。 安 攻击者故意触发错误,读取堆栈跟踪,识别 ORM 和数据库版本, 然后根据该版本中的已知漏洞制作注入有效负载。

使固定: 从生产响应中剥离堆栈跟踪。 将 CORS 设置为仅允许您的域。 禁用您不使用的 HTTP 方法。 在各处强制执行 TLS。 运行自动安全标头检查。 清理所有 HTML 输出以防止 XSS。

发布的 HTML 清理 API 条状 来自用户提供的 HTML 的恶意标签和属性:

curl -s -X POST https://api.botoi.com/v1/html-sanitize \\
  -H "Content-Type: application/json" \\
  -d '{
    "html": "<p>Hello</p><script>document.cookie</script><img onerror=alert(1) src=x>"
  }'

回复:

{
  "success": true,
  "data": {
    "sanitized": "<p>Hello</p><img src=\\"x\\">"
  }
}

<script> 标签和 onerror 属性被删除。 安全的 HTML 被返回。 在存储或呈现任何用户提供的 HTML 之前调用此端点。

API9:2023 库存管理不当

旧的 API 版本、被遗忘的暂存端点和未记录的路由会创建攻击面 不监控。 攻击者扫描 /v1/, /v2/, /api-dev/, 和 /internal/ 路径。 他们发现一个已弃用的端点缺乏安全控制 您添加到当前版本。

攻击场景: 您的团队已发货 /v2/users 具有基于角色的访问权限 控制。 但 /v1/users 未经任何授权仍在生产中运行。 攻击者 通过公共 Swagger 文件发现 v1 路径并提取整个用户表。

使固定: 维护完整的 API 库存。 停用旧版本; 不要离开他们 运行“以防有人仍然使用它们”。 将每个版本置于同一身份验证中间件后面。 扫描 您自己的基础设施,用于定期暴露路径。

API10:2023 API 的不安全消费

您的 API 调用第三方服务:支付处理器、电子邮件提供商、地理编码 API。 如果你 在未经验证的情况下信任他们的响应,受损或恶意的第三方可以注入数据 进入您的系统。 这包括信任重定向 URL、解析未经验证的 JSON 或存储 未经清理的第三方响应。

攻击场景: 您的应用程序从第三方丰富 API 获取公司数据 并存储 company_name 字段直接在您的数据库中。 丰富 API 获取 遭到破坏,攻击者注入 <script> 标签到公司名称中。 每个 在仪表板中查看公司简介的用户会执行该脚本。

使固定: 在存储或渲染之前验证和清理所有第三方响应 他们。 对传入数据使用架构验证。 设置外部呼叫的超时。 应用相同的输入 对应用于用户输入的第三方数据进行验证。

检测 API 响应中的敏感数据泄露

风险 API1 和 API3 通常会导致敏感数据离开您的 API。 这 botoi PII 检测 API 扫描文本 社会安全号码、信用卡号码、电子邮件地址、电话号码、IP 地址和 出生日期。 在集成测试中针对您的 API 响应主体运行它以捕获意外情况 部署前数据泄露。

curl -s -X POST https://api.botoi.com/v1/pii/detect \\
  -H "Content-Type: application/json" \\
  -d '{
    "text": "Customer SSN is 123-45-6789 and card is 4111111111111111"
  }'

回复:

{
  "success": true,
  "data": {
    "found": true,
    "count": 2,
    "findings": [
      {
        "type": "ssn",
        "value": "123-45-6789",
        "start": 17,
        "end": 28,
        "masked": "***-**-6789"
      },
      {
        "type": "credit_card",
        "value": "4111111111111111",
        "start": 42,
        "end": 58,
        "masked": "************1111"
      }
    ]
  }
}

如果您的 API 响应触发结果,则您的端点正在返回客户端不应看到的数据。 修复查询或 DTO 以排除这些字段。

加密静态敏感数据

当您的 API 存储敏感配置、令牌或凭据时,请在写入之前对其进行加密 到数据库。 这 botoi加密API 提供 AES-256-CBC 加密:

curl -s -X POST https://api.botoi.com/v1/encrypt/encrypt \\
  -H "Content-Type: application/json" \\
  -d '{
    "text": "sensitive-api-token-abc123",
    "password": "your-secret-key"
  }'

回复:

{
  "success": true,
  "data": {
    "encrypted": "U2FsdGVkX1+abc...encrypted_output_here",
    "algorithm": "aes-256-cbc"
  }
}

存储加密的输出。 解密用 /v1/encrypt/decrypt 仅当值为 需要。 如果攻击者通过以下方式获得对数据库的读取访问权限,这会限制爆炸半径: BOLA 或 SQL 注入漏洞。

OWASP API 安全十大清单

打印此表或将其添加到您的安全审查模板中。 在任何 API 发布之前检查每一项。

风险 查看 博托伊端点
API1 是 每个接受对象 ID 的端点都会验证所有权
API2 认证失效 登录速率受限; 代币过期; 针对敏感行动的 MFA /v1/breach/check
API3 属性认证 请求字段列入白名单; 响应 DTO 排除内部结构 /v1/pii/detect
API4资源限制 强制实施速率限制、分页上限、文件大小限制
API5功能认证 管理端点检查 API 层的角色,而不是前端
API6业务流程 高价值流量的验证码/工作量证明; 每个用户的限制
API7 SSRF 验证用户提供的 URL; 私人范围被封锁
API8配置错误 没有堆栈跟踪; CORS 受限; HTML 已净化 /v1/html-sanitize
API9库存 旧 API 版本已停用; 记录所有路线
API10不安全消费 存储前对第三方响应进行验证和清理 /v1/html-sanitize

从这里到哪里去

完整的 OWASP API Security Top 10 文档位于 owasp.org/API-Security。 每个风险页面都包含检测方法、示例攻击场景以及 CWE 参考。

对于自动检查,请将上面的 botoi 端点集成到您的 CI 管道中。 运行 PII 检测 针对 API 响应装置。 在写入时清理存储的 HTML。 检查新用户电子邮件是否存在违规行为 注册期间的数据库。 这些是测试套件的小补充,可以捕获风险扫描仪 小姐。

FAQ

OWASP API 安全性前 10 名是什么?
OWASP API 安全 Top 10 列出了十大最关键的 API 安全风险,由开放全球应用程序安全项目维护。 2023版涵盖了损坏的对象级授权、损坏的身份验证、损坏的对象属性级授权、不受限制的资源消耗、损坏的功能级授权、对敏感业务流的不受限制的访问、服务器端请求伪造、安全配置错误、库存管理不当以及 API 的不安全使用。
OWASP API 安全 Top 10 多久更新一次?
OWASP 于 2019 年发布了首个 API Security Top 10,并于 2023 年进行了更新。没有固定的更新时间表。 项目团队从安全事件、错误赏金报告和社区贡献中收集数据,然后在威胁形势发生足够大的变化时发布新版本。
什么是 BOLA?为什么它是第一大 API 风险?
当 API 端点接受来自客户端的对象 ID 并返回数据而不验证请求用户是否拥有该对象时,就会发生 BOLA(对象级授权损坏)。 攻击者更改请求中的 ID 并访问其他用户的数据。 它排名第一是因为它很常见、易于利用,并且经常大规模暴露敏感记录。
自动化工具能否捕获所有 OWASP API 安全十大风险?
不会。自动扫描仪会捕获错误配置 (API8)、缺少速率限制 (API4) 和一些注入模式(通过 API8)。 但授权缺陷(API1、API3、API5)需要扫描仪缺乏的业务逻辑理解。 您需要手动代码审查、渗透测试和架构级检查以实现完整覆盖。
如何确定首先修复哪些 OWASP API 风险的优先顺序?
从 API1 (BOLA) 和 API2(损坏的身份验证)开始,因为它们会导致直接数据泄露。 然后解决 API4(无限制资源消耗)问题以防止拒绝服务。 之后,根据哪些端点处理应用程序中最敏感的数据来解决剩余的风险。

开始使用 botoi 构建

150+ 个 API 端点,涵盖查询、文本处理、图片生成和开发者工具。免费套餐,无需信用卡。