如何防止短信接口被爆破?

如何防止短信接口被爆破?大家有没有什么好的思路

全世界无产者联合起来!
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 10
巴啦啦

验证码

2个月前 评论

就常规套路,验证码,同一个 IP 1 分钟一次,多次爆破加黑名单。

2个月前 评论
勇敢的心 (楼主) 2个月前
wanzi 2个月前
beatles 2个月前

图片验证码 + 接口节流

2个月前 评论

同一用户(IP,手机号,session_id),一定时间内次数限制。

但一定要考虑并发,不然白搭。

$mobile = trim(input('mobile'));
$fp = fopen("./locksms{$mobile}.txt", "w+");//乞丐版的并发限制,用文件锁实现
if (flock($fp, LOCK_EX)) {
    $ip = $this->request->ip();
    $today = date('Y-m-d 00:00:00');
    $log_ip_today = db('sms_log')->where(['ip' => $ip])->where('create_time', '>', $today)->count();
    $log_mobile_today = db('sms_log')->where(['mobile' => $mobile])->where('create_time', '>', $today)->count();
    if ($log_ip_today > 10 || $log_mobile_today > 10) {
        flock($fp, LOCK_UN);
        fclose($fp);
        return json(['code' => 0, 'msg' => '你今天发送过多的验证码']);
    }
    $seconds_ago = date('Y-m-d H:i:s', time() - 60); //同一手机号发送验证码至少间隔一分钟
    $last = db('sms_log')->where(['mobile' => $mobile])->where('create_time', '>=', $seconds_ago)->count();
    if ($last > 0) {
        flock($fp, LOCK_UN);
        fclose($fp);
        return json(['code' => 0, 'msg' => '验证码发送过于频繁']);
    }
   //发送短信,,,
   //成功后把发送记录写入数据表`sms_log`中
}
else {
    return json(['code' => 0, 'msg' => '请重试']);
}
2个月前 评论

验证码 同一个ip限制 短信验证有效期 (5分分钟只能获取一次) 在一个同一个手机号按小时和天设置阈值(比如一天最多获取五次等) 不过阿里的大鱼短信 就本身可以设置频率

2个月前 评论

很多应用的做法是发送短信验证码设置时间间隔,一般1分钟内只发送一次等

2个月前 评论
Shuyi

如果是API端口, 直接用这个不就好了?路由《Laravel 8 中文文档》

2个月前 评论

验证码,弄滑块验证码,像极致验证,腾讯防水墙,都是比较难破解的,然后ip,客户端限流

2个月前 评论
  1. 图形验证码。目的:防止机刷
  2. 对IP限流,对于某个IP进行限流,比如某个IP一分钟内能请求10次短信接口。超过阈值,封IP。目的:防止单个IP对批量手机号攻击。
  3. 限制服务只给同一手机号一分钟内的发送一次。目的:防止被刷接收者被骚扰。
2个月前 评论
勇敢的心 (楼主) 2个月前
MArtian 2个月前
Mr-houzi (作者) 2个月前

只有用验证的方式,没别的办法,ip,手机号别人都可以伪造的

2个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!