TL;DR / 核心结论

不可预测的 ID 只增加枚举成本;对象级授权必须由服务端针对当前主体与目标资源做出判断。

这道题最终只改了请求里的一个数字。若复盘只留下这个 payload,下一次遇到 UUID、GraphQL 或批量接口时,仍然可能找不到同一个问题。真正可迁移的是发现路径。

01最初的三个信号

  • 资源 URL 中出现与当前用户无关的顺序编号。
  • 前端隐藏了入口,但直接请求接口仍返回完整对象。
  • 服务端只检查是否登录,没有检查对象归属。
变化只发生在资源标识上HTTP
GET /api/invoices/1042 HTTP/1.1
Cookie: session=<user-a>

# 将 1042 改为 1043 后,返回了 user-b 的数据

02失败尝试同样要留下

我先检查了前端参数、角色字段和批量下载端点,都没有结果。这些失败排除了“客户端决定权限”的猜测,最终把注意力收敛到对象级授权。记录排除过程,能让复盘从答案升级为方法。

03练习环境之外的边界

访问控制测试只能在明确授权的系统、靶场或自己的实验环境中进行。技术判断与授权边界必须一起成为习惯。