手機驗證短信設計與代碼實現
# 手機驗證短信設計與代碼實現 >1. 時效限制: [5-10min] >2. 使用次數限制: 1次 >3. IP次數限制: 防止惡意刷手機驗證碼短信 >4. 手機號限制: 防止短信轟炸 >5. 跨域請求限制: 進一步限制惡意刷短信 >6. 驗證碼驗證: 進一步限制惡意刷短信
手機驗證短信設計與代碼實現
總體思路
- 時效限制: [5-10min]
- 使用次數限制: 1次
- IP次數限制: 防止惡意刷手機驗證碼短信
- 手機號限制: 防止短信轟炸
- 跨域請求限制: 進一步限制惡意刷短信
- 驗證碼驗證: 進一步限制惡意刷短信
</ol> </blockquote>
數據庫設計 (CheckCode)
ID mobile(手機號)
</blockquote>
checkCode(驗證碼)
ip(IP地址)
createAt(創建時間)
expireAt(時效時間)
isUse(是否使用)
usingAt(使用時間)具體代碼實現(mongoose + nodejs 代碼不完全正確,主要see思路吧)
- 查詢90s內是否發送過,如果存在,需要等待 90-(已發送時間)s
</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>
- 查詢手機號碼接收次數,如果太多明顯要轟炸別人,讓我們背黑鍋呀
</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() // } });
- 查詢這個Ip發送了多少次了, 如果太多明顯是來浪費我們財產來了,短信是要錢的呀老大
</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>
- 限制跨域提交
</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>
- 驗證碼限制 (同跨域提交思路)
</ol> </blockquote> 來自:http://my.oschina.net/wanglihui/blog/321101
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!