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)
