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 位问题

一个典型的易受攻击流程

  1. 对用户进行身份验证
  2. 信任请求中的 object_id
  3. 返回数据
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 中明确警告了这种误解。

正确的后端流程

  1. 对用户进行身份验证
  2. 从令牌中提取 user_id / org_id
  3. 从数据库中获取对象
  4. 验证 object.owner_id == user_id(或相应的角色/租户检查)
  5. 返回响应

少于以上任一步骤都存在风险。身份验证让你 进入大楼;对象授权决定你是否可以打开特定的门。

实用检查清单

  • 每当在 URL、JSON 负载或过滤参数(user_idorg_id)中看到 ID 时,问自己:“该用户是否应该看到这些数据?”
  • 检查导出/下载端点以及可能返回额外字段的移动 API。
  • 确保对每个返回的对象都执行所有权/角色检查。

参考资料

  • OWASP API Security Top 10 –
  • OWASP IDOR –
  • RFC 7519 – JWT –
  • RFC 6749 – OAuth 2.0 –
Back to Blog

相关文章

阅读更多 »