Authentication vs Object Authorization:每个人都会犯的 API 安全错误
发布: (2026年2月3日 GMT+8 00:07)
4 min read
原文: Dev.to
Source: Dev.to
身份验证
回答的问题: 你是谁?
典型机制:
- JWT 令牌(RFC 7519)
- OAuth 2.0 访问令牌(RFC 6749)
- API 密钥
- 会话 Cookie
当身份验证成功时,后端只会说:
“好的,我知道你是谁。”
GET /api/v1/profile
Authorization: Bearer eyJhbGciOi...
✅ 令牌有效 → 请求被允许继续。
不会对 可以访问哪些数据 做出决定。
对象授权
回答的问题: 你是否被允许访问此特定对象?
对象授权必须验证:
- 对象所有权
- 用户角色
- 组织/租户范围
- 对象状态(草稿、已删除、已归档、已付款)
未进行此类验证被归类为 对象级别授权缺失(BOLA)(OWASP API Top 10 – API1:2023)。
为什么身份验证比对象授权更容易
| 方面 | 身份验证 | 对象授权 |
|---|---|---|
| 范围 | 用户 / 会话 | 对象 / 资源 |
| 频率 | 每个请求一次 | 每访问一个对象都要检查 |
| 典型实现 | 集中式、框架处理、易于测试 | 自定义逻辑、端点特定,常常仓促实现 |
| 常见错误 | 认证绕过 | BOLA / IDOR |
| OWASP API Top 10 排名 | 较少 | 第 1 位问题 |
一个典型的易受攻击流程
- 对用户进行身份验证 ✅
- 信任请求中的
object_id❌ - 返回数据 ❌
GET /api/v1/invoices/8421
Authorization: Bearer USER_A_TOKEN
{
"invoice_id": 8421,
"user_id": 999,
"amount": 4500,
"status": "paid"
}
哪里出错了?
- 身份验证成功。
- 没有所有权校验 → 用户 A 访问了用户 B 的发票。
这就是 textbook IDOR 漏洞(OWASP IDOR 解释)。
常见误解:“ID 不可猜测,所以我们安全”
- UUID、哈希、加密 ID、Base64 字符串都 防止猜测,但 不能防止授权绕过。
- 如果后端不验证所有权,任何标识符格式都会失效。
OWASP 在 OWASP API Authorization Guide 中明确警告了这种误解。
正确的后端流程
- 对用户进行身份验证
- 从令牌中提取
user_id/org_id - 从数据库中获取对象
- 验证
object.owner_id == user_id(或相应的角色/租户检查) - 返回响应
少于以上任一步骤都存在风险。身份验证让你 进入大楼;对象授权决定你是否可以打开特定的门。
实用检查清单
- 每当在 URL、JSON 负载或过滤参数(
user_id、org_id)中看到 ID 时,问自己:“该用户是否应该看到这些数据?” - 检查导出/下载端点以及可能返回额外字段的移动 API。
- 确保对每个返回的对象都执行所有权/角色检查。
参考资料
- OWASP API Security Top 10 –
- OWASP IDOR –
- RFC 7519 – JWT –
- RFC 6749 – OAuth 2.0 –