JWT鉴权漏洞:用户A可通过自身JWT获取用户B数据的解决办法
JWT权限匹配问题解决方案
核心问题
当前接口仅验证JWT的有效性(签名、过期时间等),未校验JWT对应的用户身份与请求目标用户是否一致,导致越权访问。
具体解决方案
1. 在JWT Payload中嵌入用户唯一标识
生成JWT时,将用户的唯一身份标识(如用户ID、用户名)写入Payload,推荐使用标准字段sub表示用户ID,也可自定义字段:
{ "sub": "user_a_123", "username": "A", "exp": 1718923200, "role": "user" }
注意:Payload仅做Base64编码,不要写入密码等敏感信息。
2. 接口层强制校验身份匹配
在/fetch/user/{target_user}接口的认证逻辑后,增加身份匹配校验:
- 解析JWT获取Payload中的用户标识(如
username或sub); - 提取请求中的目标用户参数(URL路径参数、请求体参数等);
- 对比两者,不一致则直接返回403无权限响应。
示例伪代码(Python):
def fetch_user_handler(request): # 1. 解析并验证JWT有效性(已有逻辑) jwt_payload = validate_and_parse_jwt(request.headers["Authorization"]) if not jwt_payload: return {"code": 401, "msg": "身份认证失败"} # 2. 获取当前用户与目标用户 current_user = jwt_payload["username"] target_user = request.path_params["target_user"] # 3. 身份匹配校验 if current_user != target_user: return {"code": 403, "msg": "无权限访问该用户数据"} # 4. 校验通过,查询并返回数据 return get_user_from_db(target_user)
3. 扩展角色权限(可选)
若系统存在管理员等特殊角色,可在JWT Payload中加入role字段,校验时增加角色判断:
# 管理员允许访问所有用户数据 if jwt_payload.get("role") == "admin": pass elif current_user != target_user: return {"code": 403, "msg": "无权限访问该用户数据"}
内容的提问来源于stack exchange,提问作者Batallion
相关产品推荐
相关产品推荐

