任何已登录用户都可按 ID 查询其他用户记录
原文依据:2 处读取用户的端点要求登录,却没有像更新和删除端点那样检查 current_user.id 与 user_id;已认证用户可选择任意整数 ID,端点会返回 User 响应模型包含的字段。
用户资料可被其他普通账户枚举和读取。具体泄露范围取决于未提供的 User 响应模型,但该访问控制缺口适用于模型公开的所有字段。
按 ID 读取用户的端点只要求调用者已登录,并未验证其是否读取本人或具有管理员权限;相比之下,同文件的更新端点明确检查 ID。若采用该示例,任何有效登录用户都可尝试枚举 ID,并收到 User 响应模型暴露的字段。具体泄露范围因未提供 User 模型而无法确定。用户应要求作者说明访问策略,并加入本人或角色权限校验及最小化响应字段。
@router.get("/{user_id}", response_model=User)async def read_user( user_id: int, db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user)): """Get user by ID.""" user = await user_service.repository.get(db, user_id) if not user: raise HTTPException(status_code=404, detail="User not found") return user查看另外 1 个位置
@router.patch("/{user_id}", response_model=User)async def update_user( user_id: int, user_in: UserUpdate, db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user)): """Update user.""" if current_user.id != user_id: raise HTTPException(status_code=403, detail="Not authorized")