手機短信驗證

摘記java

實現流程:數據庫

      手機短信驗證明現的流程是:用戶註冊會員的時候,先輸入本身的手機號碼,點擊獲取驗證碼;您的網站隨機生成一個數字做爲驗證碼,同時調用驗證碼短信接口給這個用戶發送一條短信;用戶收到短信後填寫驗證碼,你再跟你生成的數字進行比對,若是一致,那麼說明用戶填寫的手機號碼是正確的,驗證成功。跨域

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

 

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

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

數據庫:網站

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

 

代碼:設計

  • 查詢90s內是否發送過,若是存在,須要等待 90-(已發送時間)s
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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
2
3
4
5
6
7
8
9
10
11
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()  //
         }
     });
  • 查詢這個Ip發送了多少次了, 若是太多明顯是來浪費咱們財產來了,短信是要錢的呀老大
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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
2
3
4
5
6
7
8
9
10
11
//渲染頁面時
  var oldCrsf = "12345679" ;
  req.session._csrf = oldCrsf;
  
  //接受提交
  var _crsf = req.body._crsf;
  if (_crsf !== req.session._csrf) {
     res.send( 302 );
  } else {
     // ok
  }
  • 驗證碼限制 (同跨域提交思路)
相關文章
相關標籤/搜索