在接口测试中,验证 用户权限隔离 是确保系统安全性的关键环节,主要目标是防止 垂直越权(不同角色权限的非法访问)和 水平越权(同角色用户间的非法访问)。以下是完整的测试方法与步骤:
一、权限隔离测试场景分类
测试类型 | 定义 | 示例场景 |
---|---|---|
垂直越权测试 | 验证低权限用户无法访问高权限用户的接口或功能。 | 普通用户尝试访问管理员接口(如删除用户、修改系统配置)。 |
水平越权测试 | 验证用户A无法访问或操作用户B的数据或功能(同角色但不同账户)。 | 用户A通过篡改参数获取用户B的订单详情或修改用户B的密码。 |
条件越权测试 | 验证用户仅在满足特定条件时拥有权限(如资源所有者或特定状态)。 | 用户只能修改自己创建的订单,且订单状态为“未支付”时允许取消。 |
二、核心测试方法
1. 角色权限映射分析
-
步骤:
-
明确系统中所有用户角色(如管理员、普通用户、访客)及其对应的权限清单。
-
整理每个接口的权限要求(如读取、写入、删除)。
-
生成 权限-接口矩阵表,标注每个角色允许访问的接口列表。
-
-
输出示例:
接口路径 管理员 普通用户 访客 /api/users
GET - - /api/orders
GET GET - /api/orders/{id}
PUT PUT* - * 仅限订单所有者
2. 垂直越权测试
-
测试步骤:
-
低权限用户访问高权限接口:
-
使用普通用户Token调用管理员接口(如
DELETE /api/users/123
)。 -
预期结果:返回
403 Forbidden
或401 Unauthorized
。
-
-
未登录用户访问需认证接口:
-
不携带Token调用需登录的接口(如
GET /api/profile
)。 -
预期结果:返回
401 Unauthorized
。
-
-
-
工具实现(以Postman为例):
bash
Copy
# 普通用户Token测试管理员接口 GET /api/admin/config Headers: Authorization: Bearer {普通用户Token} → 预期状态码:403
3. 水平越权测试
-
测试步骤:
-
篡改资源ID:
-
用户A登录后,调用
GET /api/orders/100
(订单属于用户A),记录响应。 -
修改ID为
101
(订单属于用户B),再次请求。 -
预期结果:返回
404 Not Found
或403 Forbidden
,且数据不可见。
-
-
参数遍历测试:
-
使用工具(如 Burp Suite)自动化遍历ID参数(如1-10000),检测是否返回其他用户数据。
-
-
-
工具实现(以Python Requests为例):
python
Copy
# 用户A尝试访问用户B的资源 import requests token = "用户A的Token" response = requests.get( "https://api.example.com/orders/101", headers={"Authorization": f"Bearer {token}"} ) assert response.status_code == 403, "水平越权漏洞存在!"
4. 条件越权测试
-
测试步骤:
-
资源所有权验证:
-
用户A创建订单后,尝试修改用户B的订单(如
PUT /api/orders/200
)。 -
预期结果:拒绝操作,返回
403 Forbidden
。
-
-
状态依赖权限验证:
-
用户尝试取消已完成的订单(状态为“已完成”)。
-
预期结果:返回
400 Bad Request
,提示“订单不可取消”。
-
-
-
SQL注入式测试(验证后端是否依赖前端参数判断权限):
bash
Copy
# 篡改请求体中的用户ID字段 POST /api/update-profile Body: {"user_id": "123", "name": "hacker"} → 后端应忽略user_id,从Token中提取真实用户ID。