昨天突然收到短信服务提供商报警,说我们的短信接口遭受攻击,收到大量短信验证码通知。登录后台管理服务,发现确实收到攻击,正常一天的发送量不会超过100条,但昨天已经突破三千,并且还在上涨;登录服务器日志查看,也确实发现超出正常范围的访问请求。
当时写接口的时候,用post请求,也就是想尽量不向攻击者暴露接口参数,但还是想得太简单了,攻击者均为职业选手,或称为黑客(虽然其实很低级),简单的post或get无法迷惑他们。当初设计接口的时候,http请求,仅包含手机号码在内的三个参数,服务器没有时间防护、签名校验等措施,基本属于“裸奔”状态,给“黑客”留下了漏洞。
修复此漏洞的方法,整理下来,不外乎以下五种:
- 图文验证码:在发送验证码前,必须先进行图文识别,通过后才可发送验证码;除了有相当高的图文验证码识别技术,一般图文验证码是不容易被识别的,因此也是最有效的防攻击手段;
- 流程改进:在发送验证码前,进行其他认证操作,比如密码设置、身份识别、输入更多信息等,使得虚假信息无法正常发送。
- 接口签名:设置隐含的签名密钥,对接口请求参数进行签名,在服务器端进行签名有效性的验证。这种办法也是一种较为有效的方法,但密钥在客户端的安全需要得到保证。
- 时间防护:限制手机号码在指定时间的发送次数,比如60s或120s内仅允许一次发送、一天仅允许10次发送等,防止频繁发送;这种方式无法彻底解决短信攻击问题。
- ip防护:对发起发送请求的服务器ip进行限制。一般黑客发起攻击的服务器较为有限,当大批量的请求部署在服务器上时,后台会跟踪到频繁发送请求的黑客服务器ip地址,可以对其地址进行类似黑名单的管制。当发现同一个ip短期发送大量请求时,可以限制其访问。这种方式也无法彻底解决短信攻击问题。
最后,我想,程序员不能偷懒,不能侥幸,“黑客”无处不在。