摘记
实现流程:
手机短信验证实现的流程是:用户注册会员的时候,先输入自己的手机号码,点击获取验证码;您的网站随机生成一个数字作为验证码,同时调用验证码短信接口给这个用户发送一条短信;用户收到短信后填写验证码,你再跟你生成的数字进行比对,如果一致,那么说明用户填写的手机号码是正确的,验证成功。
手机验证短信设计与代码实现 >1. 时效限制: [5-10min] >2. 使用次数限制: 1次 >3. IP次数限制: 防止恶意刷手机验证码短信 >4. 手机号限制: 防止短信轰炸 >5. 跨域请求限制: 进一步限制恶意刷短信 >6. 验证码验证: 进一步限制恶意刷短信
数据库:
ID mobile(手机号)
checkCode(验证码)
ip(IP地址)
createAt(创建时间)
expireAt(时效时间)
isUse(是否使用)
usingAt(使用时间)
代码:
- 查询90s内是否发送过,如果存在,需要等待 90-(已发送时间)s
1234567891011121314151617181920var mobile =‘155*****111‘,ip =‘127.0.0.1‘,now = Date.now();CheckCode.findOne({mobile: mobile, expireAt:{$gt: now}}, function(err, checkCode) {if(err) {//错误了}elseif(checkCode) {var now = Date.now(),diffSeconds = parseInt((now - checkCode.createAt.getTime())/1000,10);if(diffSeconds <90) {//时间间隔太小,老弟你刷短信纳是吧,果断拒绝你}else{checkCode.setIsUsed();//设置为已经使用过newCheckCodeByMobile(mobile, {ip:ip}, done);}}else{newCheckCodeByMobile(mobile, {ip:ip}, done);}}
- 查询手机号码接收次数,如果太多明显要轰炸别人,让我们背黑锅呀
1234567891011var end = now,begin = now -24*60*60*1000;CheckCode.count({mobile: mobile, createAt: {$gt: begin, $lt: end}}, function(err, count){if(err) {//错误}elseif(count >3) {//老大,都给你手机号发3次了还收不到,你是要用短信轰炸别人呢还是真收不到,果断舍弃你这用户把}else{newCheckCodeByMobile()//}});
- 查询这个Ip发送了多少次了, 如果太多明显是来浪费我们财产来了,短信是要钱的呀老大
123456789101112131415161718192021CheckCode.count({ip:ip, createAt: {$gt: begin, $lt: end}}, function(err, count){if(err) {//err}elseif(count >6) {//老大,你这个Ip都浪费了我5毛钱了,你还不甘心呀,算了,放弃你了}else{newCheckCodeByMobile()//}});//生成手机验证码function newCheckCodeByMobile(mobile, options, callback) {if(arguments.length ===2) {callback = options;options = {};}var ip = options.ip;var now = Date.now(),expireAt = now +60*1000*5;//5分钟后时效CheckCode.save({mobile: mobile, ip:ip, checkCode:"123456", isUse:false}, callback);}
- 限制跨域提交
1234567891011//渲染页面时var oldCrsf ="12345679";req.session._csrf = oldCrsf;//接受提交var _crsf = req.body._crsf;if(_crsf !== req.session._csrf) {res.send(302);}else{// ok}
- 验证码限制 (同跨域提交思路)
原文:http://www.cnblogs.com/zxtbk/p/4563943.html