-
使用时间戳方式
在请求参数中添加时间戳参数,服务器端首先验证时间戳timestamp是否有效,比如是服务器时间戳5分钟之前的请求视为无效。 -
使用签名验证+用户编号的方式
举个例子:
1、String sign = MD5(参数+密钥+时间戳 )得本次请求的签名。
2、在Redis中记录key=用户编号,value=签名值。
protected void replayAttackDefending(EncryptModel encryptModel) {
/**
* 如果未开启防重放攻击则返回
*/
if (!this.replayAttack) {
return;
}
/**
* 时间判断
*/
Long ts = Long.valueOf(encryptModel.getTs());
Long current = System.currentTimeMillis();
int tenMinutes = 10 * 60 * 1000;
if (current - ts > tenMinutes) {
ResponseEnum.PERMISSION_NOT_SAFE.assertNotNull(null);
}
/**
* 重复判断
*/
ClientLoginVo loginUser = LoginContextUtil.getLoginUser();
log.info("the login user is {}", JSON.toJSONString(loginUser));
String key = loginUser.getId() + "_" + encryptModel.getSign();
boolean isExists = redisUtil.setIfAbsent(key, "", Duration.ofMinutes(5));
ResponseEnum.PERMISSION_NOT_SAFE.assertEquals(false, isExists);
}
网友评论