从前端和后端看,如何防止短信接口被盗刷攻击

上一篇写了DDos攻击,想起之前公司也遇到过短信接口被攻击,说来惭愧,那段代码还是自己写的,当时没考虑到短信接口的安全性,导致公司短信余额被刷完(还好短信账户剩的余量也不多了,不然给公司带来大损失),以下总结了几种防止短信接口被盗刷的方法,仅以前端和php后端两方面解释。

1. 加图形验证码

最直接且有效且免费(关键)的方法,加图形验证码。
在这里插入图片描述
如果你觉得这类图形验证码容易被破解,可以是这添加干扰点或者使用中文,或者觉得和用户交互不好看,市面上还有很多类似的验证产品,如极验,都是不错的方案,但是要收费。

2. 后端限制ip每天发送量和每个手机号发送量

这里直接贴出参考代码,以tp5做例子,首先要配置好redis作为其缓存

//在config/cache.php
return [
    // 使用复合缓存类型
    'type'  =>  'complex',
    // 默认使用的缓存
    'default'   =>  [
        // 驱动方式
        'type'   => 'file',
        // 缓存保存目录
        'path'   => '../runtime/default',
    ],
    // 文件缓存
    'file'   =>  [
        // 驱动方式
        'type'   => 'file',
        // 设置不同的缓存保存目录
        'path'   => '../runtime/file/',
    ],
    // redis缓存
    'redis'   =>  [
        // 驱动方式
        'type'   => 'redis',
        // 服务器地址
        'host'       => '127.0.0.1',
    ],
];
namespace app\index\controller;

use think\Request;
use think\Cache;

class Index
{
    public function sendSms(Request $request)
    {
        $phone = $request->get('phone');
        $ip = $request->ip();
        if($this->_vaildSendIp($ip)&&$this->_vaildSendPhone($phone)){
            //号码和ip不在黑名单,则走剩余流程
        }else{
            //验证不通过,则拒绝发送短信
        }
    }

    /*
     * 验证发送短信的ip是否超过限制
     * @param string $ip
     * @return bool
     */
    private function _vaildSendIp($ip)
    {
        $cache = Cache::store('redis');
        //该IP是否已经被加入黑名单
        if($cache->has('blackListOfIp-'.$ip)){
            return false;
        }
        $key = $cache->get('todaySendIpTimes-'.$ip);
        if($key){
            $cache->inc('todaySendIpTimes-'.$ip);
            //超过6次就加入黑名单,所以查询出来是6次的话,则包含这一次就是7次
            if($key >= 6 ){
                $cache->set('blackListOfIp-'.$ip,1);
                return false;
            }
        }else{
            //可以设置有效期24小时,也可以将添加时间加到key上面,写个定时任务清理掉过期的key
            $cache->set('todaySendIpTimes-'.$ip,1,24*60*60);
        }
        return true;
    }

    /*
     * 验证发送短信的号码是否超过限制
     * @param string $ip
     * @return bool
     */
    private function _vaildSendPhone($phone)
    {
        $cache = Cache::store('redis');
        //该IP是否已经被加入黑名单
        if($cache->has('blackListOfPhone-'.$phone)){
            return false;
        }
        $key = $cache->get('todaySendPhoneTimes-'.$phone);
        if($key){
            $cache->inc('todaySendPhoneTimes-'.$phone);
            //超过6次就加入黑名单,所以查询出来是6次的话,则包含这一次就是7次
            if($key >= 6 ){
                $cache->set('blackListOfPhone-'.$phone,1);
                return false;
            }
        }else{
            //可以设置有效期24小时,也可以将添加时间加到key上面,写个定时任务清理掉过期的key
            $cache->set('todaySendPhoneTimes-'.$phone,1,24*60*60);
        }
        return true;
    }
}

但如果黑客攻击一般都是采取更换ip或者伪造IP,随机使用号码等方法,代码只能起到减少损失的防护

3. 更换短信功能服务的token、key等信息

这起情况不常见,因为一段用于链接短信功能的accessKey等一般不会泄露。所以当查询访问日志没有调用短信接口,但短信数一直被盗刷,就要引起重视,可能是accessKey、账号密码等泄露了。可以手动去服务商官网更改accessKey和密码,或者在代码里把accessKey缓存,设置有效期,等有效期过了调用服务商接口重新获取accessKey

4. 使用用户短信发信息到指定号码验证

这种操作我只在qq邮箱验证的时候使用过,对用户十分不友好。就是让你发送指定内容到某号码来验证,这种估计也就大厂才这样做,而且还需要你在服务器端有接受短信的一套设备,有兴趣的朋友自己搜一下技术原理,不赘述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值