web-api-permission-probe
把"Web 应用接口层权限探测"的方法论固化为可复用流程。核心认知:前端菜单 / 路由隐藏不等于接口层加锁。很多系统前端只藏按钮,真正防线在后端接口;探测必须验证接口层,而非只看页面能不能看到。
可套到任意带登录态的 Web 系统(订单系统、会员中心、内容平台等),与具体业务无关。
何时用
- 权限审计 / 越权风险评估
- 验证"某角色看不到的菜单,对应接口是否也调不通"
- 上线前确认敏感接口真的按角色拒绝
核心原则
- 核准真实路径:探测前读前端
src/api/*.js(或后端路由定义)拿真实接口路径,不要凭记忆或文档(文档常未过滤 / 不全)。 - 多角色实测:用管理员 / 普通角色 / 无权限角色三种 token 分别调同一接口,比较返回。
- 看接口层定级:前端隐藏但接口不锁 = 越权风险,严重度以接口层为准。
- 200 不等于成功:框架可能返回
200 + {code:500},必须解析业务码。 - 先解析响应结构:分页可能是
data.rows+data.total(非 records/list);某些端点data直接是数组。先识别再断言。 - 按 path 判重:同 path 可能多入口,判重按 path 而非 id。
分步流程
- 读前端 api 定义,导出接口清单(path / method / 所需角色)。
- 准备多角色 token(管理员、普通、匿名)。
- 对每个敏感接口,逐角色调用,记录 HTTP 状态 + 业务码 + 响应结构。
- 比对:无权限角色是否返回 403 / 拒绝;若返回 200 + 业务成功 → 越权漏洞。
- 输出探测报告:接口 × 角色矩阵,标注每项是否真锁。
- 定级:接口可越权 > 仅前端可见。
坑(来自真实事故)
- 只看前端菜单:菜单隐藏但接口未加接口层权限注解 → 手敲 URL 直接越权。
- 凭文档路径:文档里的路径未过滤(含无权限注解的端点)→ 调不通误判。
- HTTP 200 即成功:框架统一 200 包业务码 → 看到 200 以为通,实际业务 500。
- 判重按 id:重跑造出同 path 双入口,污染探测样本。
- 用数据范围推断角色:data_scope 不可靠,必须按 role_key / 接口注解判定。
骨架脚本
scripts/probe_permissions.py:生成接口 × 角色探测矩阵,提供真实 HTTP 探测函数与响应结构解析(兼容 data.rows/data.total 与裸数组两种)。改 token / base_url 即可跑,无业务耦合。
验收清单
见 references/acceptance-checklist.md(7 条,上架 / 改版前必跑)。
触发词
接口权限探测、越权测试、权限审计、菜单隐藏不等于锁、permission probe。