Redis 助力预防重放攻击(redis 防止重放攻击)
Redis是一款用Perl语言实现的开源,基于内存的键值(key-value)存储系统。它支持多种数据类型,比如字符串,哈希,列表,集合,有序集合等,除此之外,还搭载着丰富的特性,如复制、数据持久化等,其特性使其在NoSQL系列当中十分受欢迎,也得到广泛应用。
Redis独特的业务场景使其可以有效解决一些传统的解决方案,其中之一就是重放攻击的预防。重放攻击是指当攻击者拦截两个终端间的网络通信,并重复发送相同的数据包,从而触发某些认证或其他协议的攻击行为。由于Redis的复制和持久化的特性,可以用一种很简单的方法,以token的形式在Redis中储存每次请求,可以有效防止重放攻击。
假如一个用户登陆系统,可以使用以下代码来记录该次请求:
// 用户登录
if(validateInput(loginInfo)) { //生成并返回一个token
let token = TokenGenerator(); //将token存储在Redis中
redisClient.hmset("token:uid_"+loginInfo.uid, token); return token;
}
当用户发起新的请求时,我们可以先查询Redis中储存的这个token是否存在,若不存在,则说明是一次新的请求,若存在,则说明已经发起过,可以判定为重放攻击,从而拒绝请求:
// 检查token
if(checkToken(token)) { //是否存在于Redis中
let tokenFromRedis = awt redisClient.hget("token:uid_"+loginInfo.uid, token); if(tokenFromRedis) {
//重放攻击 禁止请求 throw ResponseError('bad request', 'Duplicate requests detected');
} else { //通过验证 数据正确
return token; }
}
以上是 Redis 预防重放攻击的一种实现方式,可以比较简单的预防重放攻击,也可作为其他攻击的防御与检测。Redis的便利及丰富的特性使它有很多的用处,也弥补了许多传统存储系统的不足。