产品安全:短信验证码的防攻击策略

5 评论 15677 浏览 134 收藏 8 分钟

在短信验证码的产品设计过程中有哪些事项是需要注意的呢?

短信验证码如今的应用之广无需赘述,各大银行的网上银行、各种手机APP、各种类型的网站,都需要借助短信验证码完成相关业务。在使用过程中,由于产品设计过程中防范意识薄弱,经常会出现短信被恶意攻击的事件,引起一些不必要的损失。下面我们就一起了解下短信验证码产品设计过程中的注意事项。

短信恶意攻击的目的是什么?

目前市面上的短信恶意攻击无非是有两种目的:

第一是以攻击某个特定的手机号为目的,黑客利用互联网中多个未经防护的短信发送接口,循环调用接口向该手机号发送短信,使手机号的拥有者不堪其扰。

第二是以恶意刷取目标网站短信验证码费用为目的,黑客发现某个未加防护的短信发送接口后,会按照某个手机号码列表,循环发送短信验证码,攻击期间黑客会不断变换ip地址,可刷取数以万计甚至更高的短信费用。被攻击的公司在损失费用的同时,也必定会收到用户的投诉,公司形象也会受损。

容易被攻击的场景

最常被攻击的场景是用户注册页面,或者是手机短信验证码快捷登录页面、网络在线投票等页面。此类场景下的发送短信验证码的接口,往往未对调用方进行相关的身份验证。

几种防攻击策略使用过程中的思考

几种防攻击策略都能在一定程度上起作用,但是会对用户体验产生不同的影响,在实际使用过程中,需要考虑到实际情况,组合使用以下策略。

设置短信发送时间间隔

设置同一个号码重复发送的时间间隔,一般设置为60-120秒。该手段可以在一定程度上防止短信接口被恶意攻击,且对用户体验没有什么伤害。但是不能防止黑客更换手机号进行攻击,防护等级较低。

手机号获取短信验证码次数限制

限制某个特定手机号某个特定时间段内获取短信验证码次数的上限。采用这种策略时在产品设计过程中,有几点值得认真思考。

  1. 谨慎定义上限值。根据业务真实的情况,甚至需要考虑到将来业务的发展定一个合适的上限值,避免因用户无法收到短信验证码而带来的投诉。
  2. 谨慎定义锁定时间段。可以是24小时,可以是12小时、6小时。需要根据业务情况进行定义。
  3. 考虑用户手机无法获取到短信验证码的后续方案。如果真的有用户无意间触发了上限值,但是他真的需要使用某项业务,有可能打客服电话。此时可以让用户等待,渡过锁定期后自行解锁。也可以在客服操作的后台,增加手动解锁功能,这里就不展开说了。

IP限制

设置单个IP地址某个时间段内最大的发送量。该手段可很好的预防单一IP地址的攻击,但是也有两个很明显的缺点:

  1. 对于经常变更IP地址进行攻击的黑客,该手段没有很好的效果。
  2. IP的限制经常会造成误伤。如在一些使用统一无线网的场所,很多用户连接着同一个无线网,这个IP地址就容易很快达到上限,从而造成连接该无线网的用户都无法正常的收到验证码。

增加图形验证码

在发送短信验证码之前,必须通过通过图形验证码的校验。这种手段可有效地防止各种攻击,因此也是目前非常普遍的短信防攻击机制。但是在使用过程中涉及到用户体验问题,不能简单粗暴地套用这一策略。以下几个点值得仔细斟酌:

  1. 能不能每次发送短信验证码的时候,都先输入图形验证码?我的意见是最好不要,一般来说这样做会极大地影响用户体验,虽然是安全了,但是用户用着不爽了。
  2. 可以给一个安全范围。不妨结合手机号限制、IP限制来考虑,比如同一个手机号当天第3次获取图形验证码的时候,出现图形验证码;比如同一个IP地址当天获取验证码次数超过100次后,出现图形验证码。
  3. 图形验证码的具体选用类型。有文字(字母数字)验证码、滑动验证码、选字验证码等,根据具体的业务场景来选取。

改变发送验证码的流程设定

此类策略属于开脑洞式的、跳出常规思维的解决问题的办法,举两个例子:

  1. 注册的场景下,可以先让用户输入手机号,接着设置密码,密码设置成功之后再进行短信验证码的发送。这样就从流程上增大了黑客的攻击成本,可大大避免非攻击的概率。
  2. 像微信、QQ以及一些其他应用那样,让用户先发送指定短信给企业,以此来验证用户是否掌握着这个手机,企业验证通过后再进行接下来的短信验证码发送。这真是一个绝妙的主意,从根本上杜绝了黑客攻击的可能。但是一般的应用需要谨慎使用这个功能,考虑自己的产品有没有必要做这种功能的开发,是不是普通的策略就够用了。而且面对这种用户体验不是那么好的方式,自己的产品是否有足够的信心相信用户一定会接受这种引导。

以上是对于几种防攻击策略的思考,在具体的产品设计过程中,可以综合使用,在产品安全和优秀的用户体验之间寻找一个极佳的平衡。

 

本文由 @最初的梦想 原创发布于人人都是产品经理。未经许可,禁止转载

题图来自 pexels ,基于 CC0 协议

更多精彩内容,请关注人人都是产品经理微信公众号或下载App
评论
评论请登录
  1. “比如同一个手机号当天第3次获取图形验证码的时候,出现图形验证码”
    应该是:
    “比如同一个手机号当天第3次获取验证码的时候,出现图形验证码”

    来自广东 回复
    1. 优秀 😉

      来自广东 回复
  2. 稍微的补充一点细节,供交流:
    – 设置获取验证码的时间周期
    – 单位时间内(一般是一个自然日)最多获取几个验证码
    – 超过获取的数量阈值后,启动的限制策略:限制手机号、IP,或者两者都限制
    – 附加:验证码输入错误几次后,强制获取新验证码(平台安全措施非验证码安全策略)

    注册初期为避免因为安全策略而导致用户的流失,建议还是上第三方登录(登陆后是否直接验证手机号看平台)

    Web端的一些补充:
    – Web端和APP 的验证码策略是否共用,还是并行,互不干扰?
    – Web端验证码输入错误后几次,启用图形验证码并强制重新获取(这个区别于先验证图形验证码后获取手机验证码)

    来自上海 回复
    1. 和文章有重复的点

      来自福建 回复
  3. 还可以增加友情话的验证码图形验证,比如:拼接图片成功后有一个文案提示,满足用户小小的虚荣心
    cookie的时间设置,section的时间设置

    来自四川 回复