手機驗證短信設計與代碼實現

jopen 10年前發布 | 49K 次閱讀 驗證碼

# 手機驗證短信設計與代碼實現 >1. 時效限制: [5-10min] >2. 使用次數限制: 1次 >3. IP次數限制: 防止惡意刷手機驗證碼短信 >4. 手機號限制: 防止短信轟炸 >5. 跨域請求限制: 進一步限制惡意刷短信 >6. 驗證碼驗證: 進一步限制惡意刷短信

手機驗證短信設計與代碼實現


總體思路

  1. 時效限制: [5-10min]
  2. 使用次數限制: 1次
  3. IP次數限制: 防止惡意刷手機驗證碼短信
  4. 手機號限制: 防止短信轟炸
  5. 跨域請求限制: 進一步限制惡意刷短信
  6. 驗證碼驗證: 進一步限制惡意刷短信
  7. </ol> </blockquote>


    數據庫設計 (CheckCode)

    ID mobile(手機號)
    checkCode(驗證碼)
    ip(IP地址)
    createAt(創建時間)
    expireAt(時效時間)
    isUse(是否使用)
    usingAt(使用時間)

    </blockquote>

    具體代碼實現(mongoose + nodejs 代碼不完全正確,主要see思路吧)

    1. 查詢90s內是否發送過,如果存在,需要等待 90-(已發送時間)s
    2. </ol> </blockquote>

      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);
          }
      }</pre> <blockquote>
      

      1. 查詢手機號碼接收次數,如果太多明顯要轟炸別人,讓我們背黑鍋呀
      2. </ol> </blockquote>

        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發送了多少次了, 如果太多明顯是來浪費我們財產來了,短信是要錢的呀老大
        2. </ol> </blockquote>

          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);
          }</pre> <blockquote>
          

          1. 限制跨域提交
          2. </ol> </blockquote>

            //渲染頁面時
             var oldCrsf = "12345679";
             req.session._csrf = oldCrsf;

            //接受提交 var _crsf = req.body._crsf; if (_crsf !== req.session._csrf) { res.send(302); } else { // ok }</pre>

            1. 驗證碼限制 (同跨域提交思路)
            2. </ol> </blockquote> 來自:http://my.oschina.net/wanglihui/blog/321101

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!