讨论个短信验证码时效(或说失效时间)的问题

2016-08-11 06:55:50 +08:00
 zsen

昨晚喝了点酒,结果 4 点多一点就醒了,一直到现在睡不着……

不讨论短信下发延迟,以及短信平台哪家强的问题。

问一下你们的验证码短信失效时间是怎么定的?一般流程是点击发送验证码按钮后,会禁用按钮并做 60 秒倒计时,超时之后可以重新点击发送验证码。

我司目前的做法是,短信验证码的时效是 60 秒。也就是你第二次点击发送之后,会生成一个新的验证码。

这里面会遇到一个问题:短信下发延迟。也许你在使用短信验证码的时候,点了发送没反应,过了 60 秒再点,咦,收到了 2 条验证码,并且验证码不一样。该输入那个呢(有可能最后收到的反倒是已经失效的那个)?当然非要说一个一个试那也可以。。。

因此我建议服务器端生成验证码后,失效时间改为 180 秒,当 60 秒后用户重新点击,继续将当前的验证码下发给用户,这样就不会造成收到 2 次验证码不一致的小困扰了。

然而,我们技术同学没有同意(嗯,我就是攻城狮门所不齿的产品汪😄)

你们是怎么做的呢?

21036 次点击
所在节点    程序员
26 条回复
ys0290
2016-08-11 06:59:08 +08:00
我不懂,但我知道有些验证码有编号,比如请注意查收编号为 xxx 的验证码,然后手机上会出现编号为 xxx 的验证码,这应该错不了了吧?
clearbug
2016-08-11 07:13:37 +08:00
@ys0290 编号是什么?表示没见过
cnly1987
2016-08-11 07:38:56 +08:00
@zsen 这么早发帖是什么鬼,
@clearbug 申请验证码的时候 网页上显示这次的验证码编号是 XXX
9hills
2016-08-11 07:39:29 +08:00
@clearbug 你的验证码是 [131211] ,验证码序号是 [4] ,有部分网站是这么做的

说正题,这个我见过三种解决办法:

1. 验证码加序号,页面提示输入序号 x 的验证码
2. 验证码有效时间 > 超时时间,超时下发时,重发有效期没有过的验证码
3. 验证码有效时间 > 超时时间,超时下发时,发送新的验证码,但是前后两次的验证码均有效,输入任意一个即可

自由选择吧
imnpc
2016-08-11 07:39:30 +08:00
银行用的编号标识的多
就是显示网页编号 收到的短信也有这个编号
这样一一对应才有效
tianshiyeben
2016-08-11 07:42:55 +08:00
我们是这样做的,验证码十分钟过期,也就是说十分钟内发送的验证码都是相同的
NeoAtlantis
2016-08-11 08:00:50 +08:00
我见过的一种, 是直接发送类似 ABCD-123456 这样的,然后在网页上提示就是 请输入 ABCD-[(方框)]
Bardon
2016-08-11 08:01:50 +08:00
短信验证码具有强时效属性,还是用编号来区分吧,编号在点击获取的时候网页端随机出一个,再在短信里一一对应。每次获取短信的时候编号都替换掉。
这样就算短信泄漏了,被发送到第三方邮箱,也没有关系。
因为总觉得安卓手机太不安全了。
int64ago
2016-08-11 08:09:58 +08:00
本来就是这样吧,验证码的失效时间通常比较长,一般短信后面也会跟说下,比如 xxx 分钟内有效,发送间隔的限制一般是为了防误点 /乱点
imn1
2016-08-11 08:13:31 +08:00
google 的身份验证器,也是定时变换,试过输入过程中,验证器显示已经变换了,也就是说已经生成新的了,提交前一个也有效
TimePPT
2016-08-11 08:31:28 +08:00
下发验证码的 CD 时间和验证码本身的有效时间是两码事啊
zado
2016-08-11 08:42:33 +08:00
看需要取舍,时效越短越安全,但体验越不好。多条短信的话用编号或前缀区分都是个好办法,同时有效的话不利于安全,也会给用户困扰(用户会疑惑到底是那个有效)。
whisperer
2016-08-11 08:50:18 +08:00
验证码为: XXXX 发送时间: 22 点 20 分
加一个发送时间,建设银行就是这么做的

然后最好网页上再提示:请输入 22 点 20 分 发送的验证码
SourceMan
2016-08-11 09:00:02 +08:00
以最后一个为准
UnisandK
2016-08-11 09:15:08 +08:00
短有效时间的短信验证码必需配合三大运营商送达毫无延迟的短信平台,否则很可能留给用户的输入时间都是按秒算的
楼主的做法感觉挺好的,两条相同的验证码看到的瞬间就会明白不用纠结输入那条,用户体验比较好。不过有效时间的逻辑上估计最好再加个刷新,防备由于第一次与第二次点击之间的间隔时间造成用户第二次点击时有效时间剩余过少的问题
ksc010
2016-08-11 09:20:24 +08:00
@whisperer 我们也是附加上短信的发送时间
elgoog1970
2016-08-11 09:26:05 +08:00
我们的短信发送的验证码有效时间设置为 180ms , 而前端的按钮是 60ms.是用 redis 进行存储数据:)
marvinwilliam
2016-08-11 09:28:33 +08:00
请求发送验证码,先判断缓存中这个手机有没有发过,发过-等待,没有发过-请求发送短信.
zsen
2016-08-11 09:48:51 +08:00
总结了一下大家说的,基本上和 @9hills 说的三种方式一致。但从实现方案上来说(我们目前是短信失效时间=前端页面的倒计时时间):
1 、编号的形式( ABCD-[XXXX]与编号实际上是相同的方案),要做前端页面、后台验证上的调整;
2 、也就是我说的方案,验证码有效期>前端页面倒计时时间,点击重新发送之后,继续发送当前验证码。这种方案技术上改动工作量最小
3 、多次验证码都生效。这种方案的实施难度最高了。需要考虑到“关联”的验证码之间的管理,如果技术方案没做好,相对的安全风险较大。

对于验证码使用场景来说,基本上如果时间过长,用户也就可能离开了,所以太长时间并没有意义,且可能存在一定的安全隐患。
zsen
2016-08-11 09:53:39 +08:00
其实我是建议我们这边使用主、从短信下发平台的。因为通常用户需要点击再次下发验证码,基本上都是短信延迟,没有收到短信(也可能被拦截,但几率很小),为了避免用户等待的焦虑,页面上的重新发送验证码倒计时从 60 秒 改为 30 秒,并且点击重新发送验证码之后,采用第二个平台发送。这样的话才用上面说的第二套方案,体验更优。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/298533

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX