权限控制测试案例¶
权限问题经常不是页面按钮隐藏这么简单。真正需要验证的是:没有权限的人,即使直接调用接口,也不能看到或操作不属于自己的数据。
需求背景¶
系统有普通用户、客服、管理员三类角色。普通用户只能查看自己的订单;客服可以查看订单但不能修改价格;管理员可以管理用户和订单。
测试点拆解¶
| 维度 | 测试点 |
|---|---|
| 未登录 | 未登录访问页面和接口 |
| 角色权限 | 普通用户、客服、管理员可见菜单和可操作按钮 |
| 水平越权 | 用户 A 访问用户 B 的订单 |
| 垂直越权 | 普通用户访问管理员接口 |
| 数据范围 | 客服只能看分配范围内的数据 |
| 前端控制 | 按钮隐藏、菜单隐藏 |
| 后端控制 | 直接调用接口仍要校验权限 |
| token | 过期、伪造、替换 token |
用例示例¶
| 编号 | 测试点 | 步骤 | 预期结果 |
|---|---|---|---|
| AUTH-001 | 未登录访问订单页 | 清空登录态后访问订单页 | 跳转登录页或返回 401 |
| AUTH-002 | 普通用户访问自己订单 | 用户 A 登录查看自己的订单 | 查看成功 |
| AUTH-003 | 水平越权 | 用户 A 修改请求中的订单 ID 为用户 B 的订单 | 拒绝访问,不返回用户 B 数据 |
| AUTH-004 | 普通用户访问管理员接口 | 用普通用户 token 请求 /admin/users |
返回 403 或无权限 |
| AUTH-005 | 客服修改订单价格 | 客服调用修改价格接口 | 拒绝操作 |
| AUTH-006 | 管理员操作 | 管理员修改订单备注 | 操作成功并记录日志 |
接口验证重点¶
不要只看页面按钮是否隐藏。测试时要用 Postman 或 Burp 直接请求接口:
然后把订单 ID 改成用户 B 的订单 ID,观察是否能访问。
测试数据准备¶
| 数据 | 用途 |
|---|---|
| 普通用户 A | 验证只能访问自己的订单 |
| 普通用户 B | 作为水平越权目标用户 |
| 客服账号 | 验证查看权限和禁止修改价格 |
| 管理员账号 | 验证管理功能和操作日志 |
| 用户 A 订单 | 正常访问基准数据 |
| 用户 B 订单 | 越权访问测试数据 |
准备数据时要记录用户 ID、订单 ID、角色和 token,执行后再清理测试订单或恢复权限。
执行步骤示例¶
- 分别登录普通用户 A、普通用户 B、客服、管理员,保存各自 token。
- 用户 A 正常查看自己的订单,确认基准请求可用。
- 用户 A 把订单 ID 改成用户 B 的订单 ID,检查是否被拒绝。
- 普通用户直接请求管理员接口,检查是否返回 403 或无权限。
- 客服尝试修改订单价格,确认后端拒绝。
- 管理员执行敏感操作后,检查操作日志是否记录操作人和时间。
SQL 校验示例¶
SELECT id, username, role
FROM users
WHERE username IN ('user_a', 'user_b', 'service_01', 'admin_01');
SELECT id, user_id, status
FROM orders
WHERE id IN (10001, 10002);
SELECT operator_id, action, target_id, created_at
FROM operation_logs
WHERE target_id = 10001
ORDER BY created_at DESC;
缺陷示例¶
| 字段 | 内容 |
|---|---|
| 标题 | 普通用户修改订单 ID 后可查看他人订单详情 |
| 前置条件 | 用户 A 和用户 B 均存在订单 |
| 复现步骤 | 用户 A 登录后请求 /api/orders/{用户B订单ID} |
| 实际结果 | 接口返回用户 B 的订单收货人、手机号和金额 |
| 期望结果 | 返回 403、404 或无权限提示,不返回任何用户 B 数据 |
| 影响 | 隐私数据泄露,属于高风险越权问题 |
容易漏测¶
- 前端隐藏按钮,但接口没有权限校验。
- 只能防止未登录,不能防止越权。
- 用户只能看列表,但能通过详情接口看别人的数据。
- 管理员权限过大,没有操作日志。
- token 过期后接口仍可访问。
复盘问题¶
- 什么是水平越权?什么是垂直越权?
- 为什么权限必须在后端校验?
- 敏感操作为什么需要记录操作日志?