早上来到公司,手机收到验证码短信报警邮件,1个小时内被消耗掉1w条短信,只能先停了短信接口然后检查原因。很奇怪,验证码短信做了电话号码和ip限制,限制同一电话号码一小时只能只能调用5次,1分钟内不能调用第二次,同一ip一天只能调用50次,一小时能只能调用10次,ajax请求判断是本站请求才通过,我觉得应该是不会被恶意调用了的。可是还是发生了,检查步骤:
1、记录恶意攻击者的http请求头信息 采用php内置方法getallheaders --- debug_log(print_r(getallheaders(), true));
* 调试日志 * @param mixed $info */ function debug_log($info, $file=NULL) { check_dir(RUNTIME_PATH . 'Logs/debug'); file_put_contents($file?$file:(RUNTIME_PATH . 'Logs/debug/'.'debug_' . date('Ymd') . '.log'), "[" . date('H:i:s') . "] " . ( (is_array($info) || is_object($info)) ?print_r($info, true):$info ) . "\n" , FILE_APPEND); }/** * 判断目录是否存在 创建目录 * @param unknown $dir * @param number $mode * @return boolean */ function check_dir($dir, $mode = 0755) { if (is_dir($dir) || @mkdir($dir, $mode)){ return true; } if (!(check_dir(dirname($dir), $mode))){ return false; } return @mkdir($dir, $mode); }
获取到攻击者的http请求头信息,分析请求这信息正常,和用户的请求模式一模一样,ip,session_id和cookie_id都在变化,没有办法解决。 去技术群问新浪大神,大神们给了建议,首先是电话号码和ip限制,这些我都做了。最后解决办法为发送手机短信验证码之前添加一个验证,输入发送短信验证码,选择验证码时尝试了极验验证码geetest.com,效果很炫,但是免费版不支持多域名,企业版收费太贵,最后还是用自己的验证码 至此验证码短信接口受到恶意调用问题告一段落
总结 短信类代码需要一个完整类管理,做好安全防范,统一管理方便调用,发送短信验证码前需要加入图片验证码,否则会被运营商封掉端口
