redis 的 incr 自增问题

凌晨三点半的卢本伟

实现功能

用户非法访问路由,则当前ip自增加一 自增 incr 方法

实现代码如下

// dd($request->getRealIp( $safe_mode=true ));
$Redis = new Redis;
$key   = 'forbidden:ip:' . $request->getRealIp( $safe_mode = true );
$limit = 10;
#设置过期时间 2小时 读系统配置
$error_ex_time = bcmul(2,3600);
$check = $Redis::exists($key);
dd('ckeck:'.$check);
if($check && $error_ex_time > 0){
    $Redis::incr($key);
    dd('key1:'.$Redis::get($key));
    if( $Redis::get($key) >= $limit )
        return error('','当前IP非法访问次数过多,已禁用');
}else{
    if( $error_ex_time ) {
        $Redis::incr($key);
        $Redis::expire($key,$error_ex_time);
        dd('key2:'.$Redis::get($key));
    }
}

出现问题
截图 截图 截图

上面是打印自增 value 的值 发现

value 会从 5 自增 后再查询 直接变成 8

value 会从 9 自增 后再查询 直接变成 2

截图
这个是请求一次后,直接用redis查询当前的key值发现,如果自增异常就不会累加

期望 可以实现每次加一期望 可以实现每次加一

实现案例 用 set key 累加1 也可以实现当前功能

提出疑问

这是因为webman框架的原因吗

623 2 0
2个回答

powerbowen

我用你的代码在webman里跑到了40+也没有遇到问题,使用的包是 composer require psr/container ^1.1.1 illuminate/redis illuminate/events 要不把IP输出出来一起看看,插眼,等大佬回答学习经验

        $Redis = new Redis();
        $key   = 'forbidden:ip:127.0.0.1';
        $error_ex_time = 2 * 3600;
        $check = $Redis::exists($key);
        if ($check && $error_ex_time > 0) {
            $Redis::incr($key);
        } else {
            if( $error_ex_time ) {
                $Redis::incr($key);
                $Redis::expire($key,$error_ex_time);
            }
        }
        return json($Redis::get($key));
  • powerbowen 2022-11-25

    补充,如果不考虑waf问题这么写没问题,如果考虑waf问题的话要自己做处理,waf形式得到的ip是 192.167.1.2 192.168.2.3 大概这种

  • 凌晨三点半的卢本伟 2022-11-25

    按照大佬指示测试,打印ip地址,真的是ip改变了,所以key才没有获取到

  • powerbowen 2022-11-25

    IP变了,换一个唯一表示,jwt之类的可以用uid,或者看请求头里设置session或者cookie试试

  • 凌晨三点半的卢本伟 2022-11-25

    这个功能主要作用防止用户调接口,访问不存在的路由才记录,没有登录的用户是没有数据记录的,所以我只能根据ip来判断,哈哈哈哈

  • powerbowen 2022-11-25

    呕吼,那只能这样了

补充一下 我是在路由回调做数据处理

截图

截图

  • 暂无评论
年代过于久远,无法发表回答
🔝