文档章节

手机验证短信设计与代码实现

深山猎人
 深山猎人
发布于 2014/09/26 18:03
字数 631
阅读 3619
收藏 45

手机验证短信设计与代码实现


总体思路
  1. 时效限制: [5-10min]
  2. 使用次数限制: 1次
  3. IP次数限制: 防止恶意刷手机验证码短信
  4. 手机号限制: 防止短信轰炸
  5. 跨域请求限制: 进一步限制恶意刷短信
  6. 验证码验证: 进一步限制恶意刷短信

数据库设计 (CheckCode)

ID mobile(手机号)
checkCode(验证码) ip(IP地址) createAt(创建时间) expireAt(时效时间) isUse(是否使用) usingAt(使用时间)

具体代码实现(mongoose + nodejs 代码不完全正确,主要see思路吧)
  1. 查询90s内是否发送过,如果存在,需要等待 90-(已发送时间)s
    var mobile = '155*****111',
    ip = '127.0.0.1',
    now = Date.now();

    CheckCode.findOne({mobile: mobile, expireAt:{$gt: now}}, function(err, checkCode) {
        if (err) {
            //错误了
        } else if(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);
        }
    }
  1. 查询手机号码接收次数,如果太多明显要轰炸别人,让我们背黑锅呀
    var end = now,
    begin = now - 24 * 60 * 60 * 1000;
    CheckCode.count({mobile: mobile, createAt: {$gt: begin, $lt: end}}, function(err, count){
        if (err) {
            //错误
        } else if(count >3) {
            //老大,都给你手机号发3次了还收不到,你是要用短信轰炸别人呢还是真收不到,果断舍弃你这用户把
        } else {
            newCheckCodeByMobile()  //
        }
    });
  1. 查询这个Ip发送了多少次了, 如果太多明显是来浪费我们财产来了,短信是要钱的呀老大
    CheckCode.count({ip:ip, createAt: {$gt: begin, $lt: end}}, function(err, count){
        if (err) {
            //err
        } else if (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);
    }
  1. 限制跨域提交
 //渲染页面时
 var oldCrsf = "12345679";
 req.session._csrf = oldCrsf;

 //接受提交
 var _crsf = req.body._crsf;
 if (_crsf !== req.session._csrf) {
    res.send(302);
 } else {
    // ok
 }
  1. 验证码限制 (同跨域提交思路)

© 著作权归作者所有

深山猎人
粉丝 15
博文 41
码字总数 20647
作品 0
朝阳
后端工程师
私信 提问
加载中

评论(7)

短信运营商
短信运营商
推荐个好用短信验证码 通用接口 支持多种语言 无缝链接 试用+Q 2885400276测试地址:http://www.cshxsp.com/Promotion/PromotionPage
APP或网站/微信【注册决定成败】市场调查分析:目前80%的用户是因为注册短信验证码体验不佳,从而放弃注册!这是多么痛的领悟-----我公司是专业做短信验证码的供应商,6年间我们只做了一件事让每个用户注册短信验证码5秒到达,为近16000APP客户提供服务! 加我微-信: wkk-555 咨询,〔廖经理136-4173-0373〕!
知之为知之
知之为知之

引用来自“海中一虾”的评论

引用来自“知之为知之”的评论

还有关于验证码的爆破 短信下发时间需在服务端进行记录

表结构中是有创建时间的~只是我叫createAt可能不是太明显

验证码使用一次就过期的限制太紧了,这里应该主要防的是自动化攻击者吧,可以限制到2-5次会人性化些哈
深山猎人
深山猎人

引用来自“zhouyuan24”的评论

nosql 轻松解决

这个跟什么数据库没有太大关系~mysql照样轻松搞定
深山猎人
深山猎人

引用来自“知之为知之”的评论

还有关于验证码的爆破 短信下发时间需在服务端进行记录

表结构中是有创建时间的~只是我叫createAt可能不是太明显
zhouyuan24
zhouyuan24
nosql 轻松解决
知之为知之
知之为知之
还有关于验证码的爆破 短信下发时间需在服务端进行记录
Shopnc 手机短信绑定设计研究参考

一直以来我对短信方面的PHP接口代码研究不多,这里我对shopnc的代码设计方面做了一下研究,解释。 具体操作如下: 前台新用户注册后,账户安全栏的绑定手机,然后就是手机验证啦,这里需要输...

slagga
2016/10/26
48
0
手机短信验证微服务--SmsCode

SmsCode 这是什么 专为需要【手机短信验证码】使用场景而设计的微服务(Micro service),如:用户注册、找回密码、用户身份验证、验证码登录等等。 为什么要造这个轮子 首先我没有找到已实现这...

luo_yongyao
2017/02/06
4.3K
4
Spring MVC短信验证码的实现

在外部网站中短信的验证很有必要,比如在实现注册、验证用户信息等的情况下。在SpringMVC中的实现如下: 短信接口 短信接口,有些企业会购买的有移动的短信平台接口。如果是个人或者是小企业...

beibugulf
2016/09/30
1K
0
php利用云片网实现短信验证码功能

本文将以php举例,介绍网页短信验证码功能的实现。 在众多的第三方短信服务商中我选择了云片网这个短信服务商,本文也将尽可能利用最简单的方式去帮助广大开发者解决短信验证码功能模块的实现...

爱前端的小白
2017/11/17
0
0
SpringBoot 集成 Spring Security(8)——短信验证码登录

版权声明:本文版权归Jitwxs所有,欢迎转载,但未经作者同意必须保留原文链接。 https://blog.csdn.net/yuanlaijike/article/details/86164160 经过前面七章的学习,我们已经算入门 Spring S...

Jitwxs
01/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Kubernetes云供应商架构的未来

首先,我想分享SIG的使命,因为我们用它来指导我们现在和将来的工作。从我们的章程中直接来看,SIG的使命是简化,开发和维护云供应商集成,作为Kubernetes集群的扩展或附加组件。这背后的动机...

Linux就该这么学
20分钟前
1
0
线程池没你想的那么简单

前言 原以为线程池还挺简单的(平时常用,也分析过原理),这次是想自己动手写一个线程池来更加深入的了解它;但在动手写的过程中落地到细节时发现并没想的那么容易。结合源码对比后确实不得...

crossoverJie
28分钟前
16
0
Scientific Linux开发停止 相关设备将迁移至CentOS上

在经历了将近14年的版本更迭之后,这个专注于科学领域的GNU/Linux发行版本不会发布下个重大版本更新--Scientific Linux 8了。 目前维护该发行版本的成员最终决定是时候休息了,今后将不再发布...

linuxCool
32分钟前
1
0
Redux

Redux概念 Redux = Reducer + Flux,数据层框架,将所有数据都存储到store中 Redux的工作流程 Antd的使用 安装npm install antd --save import 'antd/dist/antd.css'import { Input, Butto......

星闪海洋
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部