适用场景:漏洞问题,主要是有些验证码通过随机数生成存在破解的可能。
原子操作:目前的处理逻辑主要是通过分钟级别和天级别的控制,多少分钟限制调用多少次,一天最多多少次,主要的是通过返回的值,判断是否超过限制次数。
伪代码逻辑:
1.初始化天级别的时间控制,设置过期时间为一天,key:daylock主要通过redis+lua实现,lua如下:
if(redis.call('exists', KEYS[1]) ~= 1) then
redis.call('set', KEYS[1], tonumber(ARGV[1]))
redis.call('expire', KEYS[1], tonumber(ARGV[2]))
return 1
else
return -1
end
2.取出daylock的值,添加判断,根据不同的daylock的值,初始化分钟级别minutelock的过期时间
3.然后初始化分钟级别的时间控制,lua和上面一样
4.天级别和分钟级别的控制频率,通过lua判断,如下
if(redis.call('exists', KEYS[1]) ~= 1) then
return -2
elseif(tonumber(redis.call('get', KEYS[1])) >= tonumber(ARGV[1])) then
return -1
else
return redis.call('incr', KEYS[1])
end
5.返回-1,即超过限制次数。