如何防止短信接口被恶意调用

有人是这样做的:

用户点击获取验证码时,前端跟后端都做了限制。比如说同个手机号两分钟内只能获取一次。

这样的做法跟没限制一样,形同虚设。比如说攻击者随机生成几万个手机号,然后同一时间往这些手机号上发送信息

有些人又加了图形验证码。这也是目前最常用的防护方式了,但也有可能被暴力破解,但难度有点大。

 

最近有个项目,说了为了用户体验,发送验证前不要图形验证,所以想到的方法就是ip限制了。

这边的做法是这样的:

同一个手机号,同一个IP,一分钟或两分钟内发送的次数大于某个数时,视为异常ip。

这里为什么要同一个手机号和同一个ip,而不是单单使用ip呢?

这里要根据实际情况而定,比如说某个公司的员工上万,如果一分钟内刚好有那么人登录获取验证码,那么就会把这个ip给封了,所以加了个手机号判断。

下面是一部分代码,主要使用缓存记录相关信息

        $ip = get_client_ip();
        if(cache('hd_blacklist_ip')){//判断该手机号是否在黑名单
            $blacklist_ip = cache('hd_blacklist_ip');
            if(in_array($ip, $blacklist_ip)) return json(['code'=>0]);
        }

        $blacklist_ip = [];//黑名单
        $num = 0;
        if(cache('hd_'.$mobile)){//查找缓存
            $cache_data = cache('hd_'.$mobile);

            $current_time = time();//当前时间

            //判断该发送是否是正常方式
            foreach ($cache_data as $k => $v) {
                if($v['mobile'] == $mobile && $ip == $v['ip'] && $v['create_time'] > ($current_time-60) && $v['create_time'] < $current_time){
                    $num++;
                }
            }

            if($num > 10) {//异常
                if(cache('hd_blacklist_ip')) $blacklist_ip = cache('hd_blacklist_ip');
                array_push($blacklist_ip, $ip);//把ip加入缓存黑名单
                cache('hd_blacklist_ip',$blacklist_ip,24*3600);
            }
        } 
        $cache_data[] = ['mobile'=>$mobile,'ip'=>$ip,'create_time'=>time()];
        cache('hd_'.$mobile,$cache_data,24*3600);//缓存当前登录的手机及ip

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值