问题描述
在WxAuthController中的profile接口中,直接不经过任何身份校验传入了用户iduserId,并且根据这个userId查询用户,修改用户数据。如果已登录的用户A通过直接调用接口传递用户B的userId,那么就可能造成潜在的跨用户数据修改的水平越权漏洞。
相关代码片段
- 在下面的代码片段中,直接传入了
userId,而没有添加任何的userid与当前实际登录用户的校验
*/
@PostMapping("profile")
public Object profile(@LoginUser Integer userId, @RequestBody String body, HttpServletRequest request) {
if(userId == null){
return ResponseUtil.unlogin();
}
String avatar = JacksonUtil.parseString(body, "avatar");
Byte gender = JacksonUtil.parseByte(body, "gender");
String nickname = JacksonUtil.parseString(body, "nickname");
LitemallUser user = userService.findById(userId);
if(!StringUtils.isEmpty(avatar)){
user.setAvatar(avatar);
}
if(gender != null){
user.setGender(gender);
}
if(!StringUtils.isEmpty(nickname)){
user.setNickname(nickname);
}
if (userService.updateById(user) == 0) {
return ResponseUtil.updatedDataFailed();
}
return ResponseUtil.ok();
}
建议的修复
通过当前用户的登录token获取userId, 而非直接通过controller层接口传递
问题描述
在
WxAuthController中的profile接口中,直接不经过任何身份校验传入了用户iduserId,并且根据这个userId查询用户,修改用户数据。如果已登录的用户A通过直接调用接口传递用户B的userId,那么就可能造成潜在的跨用户数据修改的水平越权漏洞。相关代码片段
userId,而没有添加任何的userid与当前实际登录用户的校验*/ @PostMapping("profile") public Object profile(@LoginUser Integer userId, @RequestBody String body, HttpServletRequest request) { if(userId == null){ return ResponseUtil.unlogin(); } String avatar = JacksonUtil.parseString(body, "avatar"); Byte gender = JacksonUtil.parseByte(body, "gender"); String nickname = JacksonUtil.parseString(body, "nickname"); LitemallUser user = userService.findById(userId); if(!StringUtils.isEmpty(avatar)){ user.setAvatar(avatar); } if(gender != null){ user.setGender(gender); } if(!StringUtils.isEmpty(nickname)){ user.setNickname(nickname); } if (userService.updateById(user) == 0) { return ResponseUtil.updatedDataFailed(); } return ResponseUtil.ok(); }建议的修复
通过当前用户的登录token获取
userId, 而非直接通过controller层接口传递