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