摘記java
實現流程:數據庫
手機短信驗證明現的流程是:用戶註冊會員的時候,先輸入本身的手機號碼,點擊獲取驗證碼;您的網站隨機生成一個數字做爲驗證碼,同時調用驗證碼短信接口給這個用戶發送一條短信;用戶收到短信後填寫驗證碼,你再跟你生成的數字進行比對,若是一致,那麼說明用戶填寫的手機號碼是正確的,驗證成功。跨域
手機驗證短信設計與代碼實現 >1. 時效限制: [5-10min] >2. 使用次數限制: 1次 >3. IP次數限制: 防止惡意刷手機驗證碼短信 >4. 手機號限制: 防止短信轟炸 >5. 跨域請求限制: 進一步限制惡意刷短信 >6. 驗證碼驗證: 進一步限制惡意刷短信session
數據庫:網站
ID mobile(手機號)
checkCode(驗證碼)
ip(IP地址)
createAt(建立時間)
expireAt(時效時間)
isUse(是否使用)
usingAt(使用時間)spa
代碼:設計
- 查詢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) {
//錯誤了
}
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);
}
}
- 查詢手機號碼接收次數,若是太多明顯要轟炸別人,讓咱們背黑鍋呀
1234567891011var 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發送了多少次了, 若是太多明顯是來浪費咱們財產來了,短信是要錢的呀老大
123456789101112131415161718192021CheckCode.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);
}
- 限制跨域提交
1234567891011//渲染頁面時
var oldCrsf =
"12345679"
;
req.session._csrf = oldCrsf;
//接受提交
var _crsf = req.body._crsf;
if
(_crsf !== req.session._csrf) {
res.send(
302
);
}
else
{
// ok
}
- 驗證碼限制 (同跨域提交思路)