API接口防止参数篡改和重放攻击
// 获取token String token = request.getHeader('token'); // 获取时间戳 String timestamp = request.getHeader('timestamp'); // 获取随机字符串 String nonceStr = request.getHeader('nonceStr'); // 获取请求地址 String url = request.getHeader('url'); // 获取签名 String signature = request.getHeader('signature'); // 判断参数是否为空 if (StringUtils.isBlank(token) || StringUtils.isBlank(timestamp) || StringUtils.isBlank(nonceStr) || StringUtils.isBlank(url) || StringUtils.isBlank(signature)) { //非法请求 return; } //验证token有效性,得到用户信息 UserTokenInfo userTokenInfo = TokenUtils.getUserTokenInfo(token); if (userTokenInfo == null) { //token认证失败(防止token伪造) return; } // 判断请求的url参数是否正确 if (!request.getRequestURI().equals(url)){ //非法请求 (防止跨域攻击) return; } // 判断时间是否大于60秒 if(DateUtils.getSecond()-DateUtils.toSecond(timestamp)>60){ //请求超时(防止重放攻击) return; } // 判断该用户的nonceStr参数是否已经在redis中 if (RedisUtils.haveNonceStr(userTokenInfo,nonceStr)){ //请求仅一次有效(防止短时间内的重放攻击) return; } // 对请求头参数进行签名 String stringB = SignUtil.signature(token, timestamp, nonceStr, url,request); // 如果签名验证不通过 if (!signature.equals(stringB)) { //非法请求(防止请求参数被篡改) return; } // 将本次用户请求的nonceStr参数存到redis中设置60秒后自动删除 RedisUtils.saveNonceStr(userTokenInfo,nonceStr,60); //开始处理合法的请求
赞 (0)