OWASP API 安全 Top 10:包含修复的清单
通过真实的攻击场景、具体修复和复制粘贴清单来了解所有 10 个 OWASP API 安全风险(2023 版),以供您进行安全审查。
您的 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 端点,涵盖查询、文本处理、图片生成和开发者工具。免费套餐,无需信用卡。