最新资讯《整蛊短信-键盘上的"整蛊专家",如何防止短信轰炸机》主要内容是"短信轰炸机",是别人通过爬虫或者其他抓取手段在网路上收集那些公司平台短信业务接口的一个集成程序,可能只需要输入一个手机号,对方一整天都会收到各大平台的注册或提醒短信,就是手机在那里响个不停。-整蛊短信,现在请大家看具体新闻资讯。
"短信轰炸机",是别人通过爬虫或者其他抓取手段在网路上收集那些公司平台短信业务接口的一个集成程序,可能只需要输入一个手机号,对方一整天都会收到各大平台的注册或提醒短信,就是手机在那里响个不停。因为现在手机只能对单方的多条短信进行屏蔽,而这种是多平台同时进行发送,很难拦截。
而被他们收集接口的乙方公司,可能一天短信的消耗量就比过一周的量,造成公司财产损失。其实相比以前我们遇到的被刷“提现”接口可以直接获取金钱,刷短信接口的行为,开始我很是想不通,就单纯为了消耗别人公司的短信费,他也得不到什么好处,为什么要这样做。当时也没想对方是出于什么理由,只是先把短信接口重新整改,防止的手法在下面介绍。
这种行为我也是最近才了解,原来网上也存在像周星驰电影"整蛊专家"的人,收取别人的钱开展对自己客户提供的人进行骚扰等业务,而短信就是其中一种,网上还有通过输入手机号,对方手机一天全部是陌生人来电的“呼死你”软件,心理承受力差的可能就抑郁,好点的话至少一天的心情都不好。
我们公司现在短信的用处主要还是注册/登陆验证码,找回密码,绑银行卡,修改支付密码,所以一天的量并不大。但那一天充了钱,不出几分钟,直接刷到没有,还好发现的早,解决的也早。
解决方法,在PC端可以在发短信验证码时,加上图形验证码校验,最好是要能和用户互动的,比如拖动或算术的,因为如果是静态的图形验证也不是很安全,毕竟现在的图片识别接口也很多。而在移动端,加图形验证体验不是很好,可以和前端通过约定密钥实现,而在H5上,就很尴尬了,而且还遇到一个只有必须绕弯路的事情。
一,APP端
1.IP和手机号黑名单(ip的例子)
ip(); $Iplist = ['180.137.97.10']; if (in_array($Ip, $Iplist)) { return $this->sendError(1, '业务限流', 200); }
2.限制指定的user_agent
sendError(1, '业务限流', 200); }
3.限制多久后才能发
(1).获取指定键的一个缓存是否存在,存在则返回$is_msgtime = cache($mobile.'_msgtimes');if (!empty($is_mesgtime)) { return $this->sendError(1, '60秒后才能继续发', 200);}(2).在短信发送成功时,存下该键名,并缓存60秒(按需求指定时间)cache($mobile.'_msgtimes', 1, 60);
4.限制单号单日发送的个数限制
(1)获取缓存指定键名的值为多少(number),并与最大限制比较$Daytimes = intval(cache($mobile.'_daytimes')) ? intval(cache($mobile.'_daytimes')) : 0;if(Daytimes>3) { return ^^^^^^^^^}(2)短信发送成功记录并累加该号该日发送量if ($Daytimes > 0) { $nextday = strtotime("today") + 24 * 60 * 60; $expires = $nextday - time(); Cache::set($mobile.'_daytimes', $Daytimes + 1, $expires); } else { $nextday = strtotime("today") + 24 * 60 * 60; $expires = $nextday - time(); Cache::set($mobile.'_daytimes', 1, $expires); }
以上部分是没用,因为ip和手机号,user_agent都可以通过特殊手段伪造,并且上面只是对单号码进行拦截,所以问题就是别人通过很多号码对接口请求,这样一样的可以刷。
5.接口添加复杂性,增加签名请求等方式
(1).请求接口时,除了手机号参数,还需带上签名(一个不可逆加密方式处理的字符串,前后端约定一个key),和时间戳.
(2).后端根据约定的key和手机号也做相应的加密与传过来的签名匹配,并和时间戳和当前服务器时间做比较,时间戳最好也作为签名加密,加密方式多种,不管是DES,RSA还是MD5看个人。
$timestamp = input('get.timestamp') ? input('get.timestamp') : 0; // 时间戳$sign = input('get.app_sign') ? input('get.app_sign') : ''; // 请求签名$terminal = input('get.term') ? input('get.term') : ''; // 终端标识 1.app 2.web$veryify_code = mt_rand(100000, 999999); // 6位数的验证码$priKey = "paobuqianjinzhf..20181029"; // 加密秘钥// 判断终端if(!empty($terminal) && ($terminal == 'app')) { $signAuth = md5($priKey.$mobile.$timestamp);if($timestamp > time()+10 || $timestamp