實踐:
一.短信驗證碼一個簡單的功能如何做到好用並不被攻擊很難那我們來看看各大網站如何做的吶?
1,獵聘網:
請求url:http://www.liepin.com/user/sendverifymessage?__mn__=newtel
post方式:newtel=15555317458
響應消息體:
成功:
{
"flag":1,
"tel":"15555317458",
"code":"SYS_00200"
}
失敗:
總結:前臺做了發送時間60秒延時處理,但是隻要去掉disabled="disabled"可以連續發送綁定click事件並沒有去掉,並且顯示倒計時雜亂(多次請求倒計時交替顯示),後臺沒做很容易通過postman類似的工具重複發送,還好做了每天請求的最高次數(應該是IP地址的限制)。
2.京東網:
請求url:https://reg.jd.com/notifyuser/mobileCode?state=&mobile=15555317458&r=0.4345317620318383
響應消息體:
成功:
{"rs":1}
失敗:
{"remain":"該手機還可獲取1次驗證碼,請儘快完成驗證"}
{"info":"120秒內僅能獲取一次短信驗證碼,請稍後重試"}:我擦倒計時後臺還做了校驗
總結:前臺做了120秒延時處理,並且後臺也做了120秒校驗(這點貌似不錯),還有一點不錯,頁面中將disabled="disabled"去掉,下一秒秒數刷新會重新加上,另外京東的響應消息都是({"info":"\u65f6\u540e\u91cd\u8bd5"})這種ASCII碼,不過京東只做了手機號的次數24小時限制,也就是說一臺電腦可以換着任意的手機號進行請求。(這些都可以通過redis簡單實現)
3.途牛網
請求url:https://passport.tuniu.com/ajax/sendMobileCode
post方式:tel=18120177459&identify_code=7j79&isReg=1
成功:
{
"success":true,
"errno":0,
"errmsg":"動態口令已發送到手機。",
"data":null
}
失敗:
{
"success":false,
"errno":-2,
"errmsg":"驗證碼輸入錯誤",
"data":null
}
總結:途牛的限制非常簡單就是每個驗證碼對應3次手機校驗,過後則需要重新發送校驗,頁面中也很有意思,途牛前端竟然寫了三個顯示發送按鈕,我冒昧加了註釋
<div class="phone_code_div">
//額,剛進來應該顯示這個
<span style="white-space:pre"> </span><a href="javascript:void(0);" class="sendToPhone get-code">獲取動態密碼</a>
//發送之後顯示這個
<span style="white-space:pre"> </span><a href="javascript:void(0);" class="sendToPhone send-code" style="display:none;"><span>60</span>秒後重新發送</a>
//重新發送應該顯示這個
<span style="white-space:pre"> </span><a href="javascript:void(0);" class="sendToPhone send-code-again" style="display:none;">重新發送</a>
</div>
總之途牛並沒有限制很死,這也是替客戶着想。有錢任性。
4.蘇寧易購
請求url:https://reg.suning.com/ajax/code/sms.do
Post方式:scen=PERSON_MOBILE_REG_VERIFY_MOBILE&phoneNum=15555317458&uid=6de279cf-5d64-4a99-98a1-35d638a04af8&code=abqw
成功:
{
"returnCode":"R0000",
"returnMsg":"成功",
"lessTimes":"1",
"domainLink":"",
"seqNum":"2"
}
失敗:
{
"returnCode":"01002",
"returnMsg":"操作過於頻繁,請稍候再試!",
"lessTimes":"",
"domainLink":"",
"seqNum":""
}
總結:蘇寧限制比較嚴ip限制3次
5.淘寶:
淘寶的限制堪比互聯網學習典範,很好的做到了安全可靠