在几天前,博主的训练平台都大致的搭建好了,准备着手开始Ai的一个开发,代理跑起来时发现代理居然可以随意的使用它人id进行交易(我写错了id),我的交易流程是:token获取账户>用户下单>前端获取用户id>后端验证用户真实性(Token)>验证成功执行交易,看似没毛病,当时我也觉得没毛病,可到了测试才发现这个大问题,用户只需拿到自己的token在下单时修改api里的id,就可以实现盗用它人的资金或持股
这该怎么解决呢?让用户自己校验?这怎么可能,让前端验证id是否一样?可代理这边如何拦截?
正当博主准备躺平的时候,突然发觉!token就是唯一的呀,那我可不可以使用token来验证双方(请求方和接收id)的id是否一致?话不多说开始写
新建一个方法,用来获取token值里的id
public String tokenLoginRequestApi(HttpServletRequest httpServletRequest) {
Cookie[] cookies = httpServletRequest.getCookies();
String token = null;
if (cookies != null) {
for (Cookie cookie : cookies) {
if ("token".equals(cookie.getName())) {
token = cookie.getValue();
break;
}
}
}
assert token != null;
String userId = JWT.decode(token).getAudience().get(0);
User user = userService.getById(userId);
return user.getId();
}
在买卖方法中试试能不能成功(代码展示相关部分)
@UserLoginToken
@PostMapping("/buy")
@ResponseBody
public String buy(HttpServletRequest request) {
String resultUserData = tokenRequestApiController.tokenLoginRequestApi(request);
User buyer = userMapper.queryById(buyOrders.getId());
System.out.println("aaa" + resultUserData);
System.out.println(buyer.getId());
}
可以看到是一致的, 接下来开始验证
@UserLoginToken
@GetMapping("/getbuy")
@ResponseBody
public String buy(HttpServletRequest request) {
String resultUserData = tokenRequestApiController.tokenLoginRequestApi(request);
User buyer = userMapper.queryById(buyOrders.getId());
if (Objects.equals(resultUserData, buyer.getId())) {
//验证一致后继续操作
}else {
model.addAttribute("message", ACCOUNT_ISSUE_MESSAGE);
//ACCOUNT_ISSUE_MESSAGE 为 "private static final String ACCOUNT_ISSUE_MESSAGE = "风控系统检测到您的环境有账户问题,请联系工作人员!";"
}
return Objects.requireNonNull(model.getAttribute("message")).toString();
}
测试:使用用户对应账号,成交没有问题
测试token账号与用户账号不一致(用户使用他人账号),报错拦截
吐槽一下:两行代码也能叫风控?哈哈哈说的好高级,在实现后我觉得博主我太牛x了,这样都能想到解决办法,必须写个文章纪念一下,但写完文章又感觉也不是啥高级技术难题,在考虑要不要发,但总有菜鸟成为雄鹰的过程,能帮助到一个人那我写的就有意义,实现起来并不难,主要在于一个思想上的转变。