You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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}接口的认证逻辑后,增加身份匹配校验:

  1. 解析JWT获取Payload中的用户标识(如username或sub);
  2. 提取请求中的目标用户参数(URL路径参数、请求体参数等);
  3. 对比两者,不一致则直接返回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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 19:06:03