登陆验证手机短信验证码方案

客户登陆通过手机发送验证码登陆,如何防止同一个手机号频繁获取验证码,目前获取的短信存入数据库中,期待大神给个好的方案。

阅读 18.8k
7 个回答

对于发送短信的限制,在客户端和服务端都要加上限制,客户端比较容易,给按钮加个倒计时就能防住大部分的小白用户。服务器端,使用Redis的setex是个很好的方法,可以在成功发送短信给某个手机号后使用setex命令加入一个有时限的标志位。如果这个标志位存在的话,就不发送并提示错误。比如这样

async function sendSMS(req,res){
        let phonenumber=req.query.phonenumber
        let result=await redis.exists(phonenumber+'SMSSended');//检测是否存在
        if(result)
            return false;
        else{
               //在这里使用你的方法发送你的短信
               await redis.setex(phonenumber+'SMSSended',60,1);//设置一个60秒的标志位
               return true;
        }
    }

当然上面的限制属于比较简单的,你也可以根据需要加入IP,Session方面的限制。

做这种功能我们都会去参考一些大型软件,因为这些软件基本都是满足用户的使用习惯。
所以,当你注册淘宝啊等等一些软件的时候,它会加入一个倒计时的操作,这样在前端就控制住了不能够频繁点击
的问题,也符合用户的使用习惯,谢谢!

使用redis缓存做键值对存储,手机号做key,验证码做value,然后做上过期时间。用户发起请求验证码时就去redis里面找,如果key存在则不发短信并提示,如果不存在,则发送短信

获取频率限制下,如楼上所说方案即可,也可记录一下频次,对过于频繁的实施验证码策略。

1.前端js控制60秒才能重发。
2.验证码发送成功后,把发送时间,手机号,验证码都存入session。如果有新的发送请求,比对上一次发送时间,限制30分钟等

肯定是后台限制的,前端限制的不靠谱。
不过如果你用的阿里之类的平台,平台本身就会有限制,每分钟每小时每天最多给同个手机号发送多少条短信。不同手机号就没辙了。

这个问题和其他答案水平都太低!作为项目大量用到短信验证码的我真的看不下去了!

问题本身,限制给同个用户频繁发送短信,这种需求还要提吗?不就是缓存到redis或mongodb或mysql,发送的时候检测下。
而用到短信验证码,更加关键的是防止短信接口被盗刷,也就是给不同用户频繁发送短信,这个问题竟然没有提出来。唉,segmentfault的整体技术水平,讨论氛围还是不够的。

如果不想费心,还是试试一些集成的账号系统吧,比如 http://www.onlyid.net 的。就不要再提这种问题浪费大家时间了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏