不可预测的 ID 只增加枚举成本;对象级授权必须由服务端针对当前主体与目标资源做出判断。
这道题最终只改了请求里的一个数字。若复盘只留下这个 payload,下一次遇到 UUID、GraphQL 或批量接口时,仍然可能找不到同一个问题。真正可迁移的是发现路径。
01最初的三个信号
- 资源 URL 中出现与当前用户无关的顺序编号。
- 前端隐藏了入口,但直接请求接口仍返回完整对象。
- 服务端只检查是否登录,没有检查对象归属。
GET /api/invoices/1042 HTTP/1.1
Cookie: session=<user-a>
# 将 1042 改为 1043 后,返回了 user-b 的数据02失败尝试同样要留下
我先检查了前端参数、角色字段和批量下载端点,都没有结果。这些失败排除了“客户端决定权限”的猜测,最终把注意力收敛到对象级授权。记录排除过程,能让复盘从答案升级为方法。
03练习环境之外的边界
访问控制测试只能在明确授权的系统、靶场或自己的实验环境中进行。技术判断与授权边界必须一起成为习惯。