一個(gè)短信驗(yàn)證碼功能引發(fā)的總結(jié)思考
從簡(jiǎn)單的功能探尋背后的技術(shù)奧秘。技術(shù)就是在生活中~
故事
昨天看到一個(gè)地址,新用戶(hù)免費(fèi)領(lǐng)取X登讀書(shū)APP的14天會(huì)員,2020年了,要開(kāi)始讀書(shū)了??吹竭@個(gè)活動(dòng)是在筆記本上,于是用筆記本瀏覽器訪(fǎng)問(wèn)活動(dòng)頁(yè)面,輸入手機(jī)號(hào),收到驗(yàn)證碼,填寫(xiě)驗(yàn)證碼,領(lǐng)取這個(gè)會(huì)員。本來(lái)以為一切就是這樣順利的結(jié)束了,然而并不是,填寫(xiě)驗(yàn)證就提示“網(wǎng)絡(luò)錯(cuò)誤”。這不科學(xué)啊,作為程序員,我下意識(shí)的按了一下F12,打開(kāi)了開(kāi)發(fā)者工具,于是看到了下面的錯(cuò)誤,如圖:
將錯(cuò)誤單獨(dú)截圖出來(lái):
簡(jiǎn)單一點(diǎn)就是出現(xiàn)了跨域的問(wèn)題。我想了一下,那估計(jì)這個(gè)活動(dòng)是針對(duì)移動(dòng)端的,我用PC端訪(fǎng)問(wèn)導(dǎo)致出現(xiàn)跨域。這個(gè)地方設(shè)計(jì)不好。
于是用手機(jī)去訪(fǎng)問(wèn)活動(dòng)頁(yè)地址,正常打開(kāi),然后填寫(xiě)手機(jī)號(hào),然后提示:
我剛才PC發(fā)了幾次驗(yàn)證碼,這個(gè)地方設(shè)計(jì)還是考慮到安全性了,不錯(cuò)。
我只能等待,在開(kāi)發(fā)角度,這個(gè)就是在一個(gè)固定的時(shí)間周期內(nèi),我的手機(jī)號(hào)只能發(fā)固定次數(shù)的驗(yàn)證碼,超過(guò)這個(gè)數(shù)量,就不會(huì)給我再發(fā)了,一個(gè)是安全考慮(接口頻繁調(diào)用),另一個(gè)可能也是費(fèi)用考慮( 防止短信驗(yàn)證碼被刷)。
過(guò)了一段時(shí)間,我在去手機(jī)端試著領(lǐng)取,發(fā)現(xiàn)一切順利,領(lǐng)取成功。
看到這里的伙伴如果是新用戶(hù),也對(duì)讀書(shū)有點(diǎn)興趣,那可以領(lǐng)取這個(gè)會(huì)員體驗(yàn)一下(不是廣告)。地址:http://t.cn/AiFfyICx
到這里本該就結(jié)束了,但是作為一個(gè)開(kāi)發(fā)人員,我覺(jué)得要簡(jiǎn)單整理一下這個(gè)發(fā)短信的功能,因?yàn)檫@個(gè)功能雖然看似簡(jiǎn)單,里面深究起來(lái)也有很多地方需要注意以及考慮的。
短信驗(yàn)證碼設(shè)計(jì)總結(jié)
互聯(lián)網(wǎng)的時(shí)代,發(fā)送短信驗(yàn)證碼已經(jīng)作為很多產(chǎn)品中必不可少的一個(gè)功能。用于的場(chǎng)景也是很多,如注冊(cè)登錄、銀行轉(zhuǎn)賬、營(yíng)銷(xiāo)活動(dòng)等(真的有很多場(chǎng)景,我就不多舉例了)。
那在發(fā)送驗(yàn)證的時(shí)候,其實(shí)很多公司用的都是第三方的短信服務(wù),這個(gè)短信的服務(wù)是需要收費(fèi)的,天下沒(méi)有免費(fèi)的午餐。那么就出現(xiàn) 刷短信的黑工具——短信轟炸機(jī) 。
短信轟炸機(jī)就是一個(gè)利用寫(xiě)好的程序來(lái)大批量刷短信的軟件,它能夠通過(guò)自動(dòng)批量提交手機(jī)號(hào)、模擬IP等方式去刷短信。
如果 需要用到短信驗(yàn)證碼的產(chǎn)品的時(shí)候,一定要制定限制規(guī)則 ,做好設(shè)計(jì)。
主要原則:發(fā)送驗(yàn)證碼是前端和后臺(tái)是需要共同設(shè)計(jì)的,這樣相對(duì)才能更加完善或者更加完美。
主要思路:
1、時(shí)間限制
xx秒后才能再次發(fā)送,常規(guī)操作
一般點(diǎn)擊驗(yàn)證后,在前端(客戶(hù)端)會(huì)進(jìn)行一個(gè)xx秒的倒數(shù)(這個(gè)倒計(jì)時(shí)可以根據(jù)具體產(chǎn)品具體業(yè)務(wù)定,很多是60s)。在這固定的時(shí)間內(nèi),用戶(hù)是無(wú)法提交多次發(fā)送信息的請(qǐng)求的。
具體時(shí)效限制要考慮產(chǎn)品本身屬性,操作難易度,網(wǎng)絡(luò)延遲,短信資費(fèi)成本等。
2、圖形驗(yàn)證碼限制 + 時(shí)間限制
(1)、在需要發(fā)送驗(yàn)證的碼的時(shí)候,先讓用戶(hù)輸入驗(yàn)證碼,當(dāng)輸入的驗(yàn)證碼通過(guò)后,才能請(qǐng)求獲取短信驗(yàn)證碼,否則獲取驗(yàn)證按鈕不激活。
(2)、在請(qǐng)求獲取驗(yàn)證后,一般在前端(客戶(hù)端)會(huì)進(jìn)行一個(gè)xx秒的倒數(shù)(這個(gè)倒計(jì)時(shí)可以根據(jù)具體產(chǎn)品具體業(yè)務(wù)定)。在這固定的時(shí)間內(nèi),用戶(hù)是無(wú)法提交多次發(fā)送信息的請(qǐng)求的。
這一點(diǎn),圖形驗(yàn)證碼不一定是必須的??赡転榱擞懈玫挠脩?hù)體驗(yàn),一開(kāi)始不需要輸入圖形驗(yàn)證碼,在操作達(dá)到一定量之后,才需要輸入圖形驗(yàn)證碼。具體情況請(qǐng)根據(jù)具體場(chǎng)景來(lái)進(jìn)行設(shè)計(jì)。
這種方法雖然使用得比較普遍,但是卻不是非常有用,技術(shù)稍微好點(diǎn)的人完全可以繞過(guò)這個(gè)限制,直接發(fā)送短信驗(yàn)證碼。
如果前臺(tái)倒計(jì)時(shí)60s,后臺(tái)驗(yàn)證碼的失效時(shí)間設(shè)計(jì)肯定不能是60,一般會(huì)是5~10分鐘。
3、手機(jī)號(hào)+指定時(shí)間可以發(fā)短信次數(shù)限制
同一個(gè)手機(jī)號(hào),指定時(shí)間之內(nèi)不能夠超過(guò)x條。
對(duì)使用同一個(gè)手機(jī)號(hào)碼進(jìn)行注冊(cè)或者其他發(fā)送短信驗(yàn)證碼的操作的時(shí)候,系統(tǒng)可以對(duì)這個(gè)手機(jī)號(hào)碼進(jìn)行限制,例如,1小時(shí)只能發(fā)送3條短信驗(yàn)證碼,超出限制則進(jìn)行報(bào)錯(cuò)(如:系統(tǒng)繁忙,請(qǐng)稍后再試)。然而,這也只能夠避免人工手動(dòng)刷短信而已,對(duì)于批量使用不同手機(jī)號(hào)碼來(lái)刷短信的機(jī)器,這種方法也是無(wú)可奈何的。
4、IP及Cookie限制
限制相同的IP/Cookie信息最大數(shù)量
使用Cookie或者IP,能夠簡(jiǎn)單識(shí)別同一個(gè)用戶(hù),然后對(duì)相同的用戶(hù)進(jìn)行限制(如:xx時(shí)間內(nèi)最多只能夠發(fā)送xx條短信)。然而,Cookie能夠清理、IP能夠模擬,而且IP還會(huì)出現(xiàn)局域網(wǎng)相同IP的情況,因此,在使用此方法的時(shí)候,應(yīng)該根據(jù)具體情況來(lái)思考。
這樣在第三點(diǎn)的基礎(chǔ)上防止惡意刷手機(jī)驗(yàn)證碼短信,如果同一個(gè)ip多次請(qǐng)求獲取手機(jī)驗(yàn)證碼短信,因?yàn)槎绦判枰X(qián),競(jìng)爭(zhēng)對(duì)手很可能惡意刷去。(我們對(duì)他人心懷善意,但是內(nèi)心要有防備之心)
5、短信預(yù)警機(jī)制
監(jiān)控短信服務(wù),做好出問(wèn)題之后的防護(hù)
以上的方法并不一定能夠完全杜絕短信被刷,因此,我們也應(yīng)該做好短信的預(yù)警機(jī)制,即當(dāng)短信的使用量達(dá)到一定量之后或者短信發(fā)送接口被超量調(diào)用,向管理員發(fā)送預(yù)警信息,管理員可以立刻對(duì)短信的接口情況進(jìn)行監(jiān)控和防護(hù)。
當(dāng)我整理了相關(guān)的資料后,稍微明白了今天上文出現(xiàn)的問(wèn)題,移動(dòng)端驗(yàn)證碼正常驗(yàn)證成功,而PC端不能進(jìn)行驗(yàn)證的原因。可能是產(chǎn)品設(shè)計(jì)上的限制惡意刷短信,做了跨域請(qǐng)求限制。 也或許這就是一個(gè)bug(不讓程序員背鍋)。
后記
一個(gè)看似簡(jiǎn)單的功能,要簡(jiǎn)單做可以很簡(jiǎn)單,要復(fù)雜也可以很復(fù)雜,作為一個(gè)技術(shù)人員,了解業(yè)務(wù),了解使用場(chǎng)景,了解用戶(hù)量等,全面考慮,多端的時(shí)代,兼容性等也要考慮。
其實(shí)這個(gè)問(wèn)題如果可以仔細(xì)想清楚的話(huà),如果以后遇到就能夠全面考慮,并且開(kāi)發(fā)人員總是說(shuō)自己做增刪查改,這個(gè)的功能設(shè)計(jì)好,里面涉及了增刪查改,更涉及了一個(gè)開(kāi)發(fā)對(duì)功能的設(shè)計(jì)能力。
做好每一個(gè)小的功能,從小的地方提升用戶(hù)體驗(yàn),是產(chǎn)品和開(kāi)發(fā)共同的責(zé)任。
最后在說(shuō)兩點(diǎn),看到的朋友思考下:
1、后臺(tái)應(yīng)該如何處理驗(yàn)證碼,保存在什么地方,內(nèi)存,緩存,還是數(shù)據(jù)庫(kù)?
2、怎么樣的短信驗(yàn)證碼用戶(hù)體驗(yàn)好,內(nèi)容和驗(yàn)證碼長(zhǎng)度?