早上来到公司,手机收到验证码短信报警邮件,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,效果很炫,但是免费版不支持多域名,企业版收费太贵,最后还是用自己的验证码 至此验证码短信接口受到恶意调用问题告一段落
总结 短信类代码需要一个完整类管理,做好安全防范,统一管理方便调用,发送短信验证码前需要加入图片验证码,否则会被运营商封掉端口