不就是個(gè)短信登錄API嘛,有這么復(fù)雜嗎?

2021-02-10    分類: 網(wǎng)站建設(shè)

Part 1:暴力破解

早上開完站會(huì),小李領(lǐng)了張新卡,要對(duì)登錄功能做升級(jí)改造,在原來只支持用戶名密碼登錄模式的基礎(chǔ)上,新增手機(jī)號(hào)和短信驗(yàn)證碼登錄。


業(yè)務(wù)分析師薇薇早就準(zhǔn)備好了故事卡,并且也考慮到這個(gè)功能的特殊性,除了平常的業(yè)務(wù)性驗(yàn)收標(biāo)準(zhǔn)外,還專門添加了一些和安全有關(guān)的條目。這張故事卡看上去是這樣的:

故事卡-274

作為用戶,我可以通過手機(jī)號(hào)和短信驗(yàn)證碼登錄,以便于我更方便的登錄。

安全驗(yàn)收標(biāo)準(zhǔn):

短信驗(yàn)證碼有效期5分鐘

驗(yàn)證碼為4位純數(shù)字

每個(gè)手機(jī)號(hào)60秒內(nèi)只能發(fā)送一次短信驗(yàn)證碼

小李看到故事卡中提到,驗(yàn)證碼長度只有4位而且還是純數(shù)字,隱約覺得強(qiáng)度有些不夠,擔(dān)心萬一黑客來個(gè)多線程并發(fā)請(qǐng)求,或者拿一個(gè)集群來暴力登錄,有可能會(huì)趕在有效期內(nèi)破解出合法的驗(yàn)證碼。

小李把自己的擔(dān)心講給了業(yè)務(wù)分析師薇薇,并且建議把驗(yàn)證碼長度增加到6位,或者在保持4位長度的情況下,改為數(shù)字和字母的組合,目的是增加驗(yàn)證碼復(fù)雜性,提高暴力破解的門檻。

薇薇聽了這兩種選擇后直搖頭,說道:“我理解你的擔(dān)心,可是業(yè)務(wù)部門那邊的需求很明確,就是為了優(yōu)化用戶登錄體驗(yàn),所以才決定做手機(jī)號(hào)和驗(yàn)證碼登錄,如果把驗(yàn)證碼弄的這么復(fù)雜,那用戶體驗(yàn)也好不到哪里去,不符合這個(gè)故事卡的初衷啊?!?/p>

“對(duì)于用戶而言,4位數(shù)字驗(yàn)證碼確實(shí)好記好填,可是對(duì)于黑客而言,就能很容易的完成暴力枚舉,理論上最多1萬次請(qǐng)求就能遍歷完所有的驗(yàn)證碼,更何況黑客沒那么倒霉,要嘗試到第1萬次才猜對(duì)……”,小李說道。

為了滿足用戶體驗(yàn)而在安全性上做出妥協(xié),這種事情小李覺得自己無法說服自己,正準(zhǔn)備掏出紙和筆跟薇薇做詳細(xì)解釋黑客攻擊手段的時(shí)候,團(tuán)隊(duì)技術(shù)負(fù)責(zé)人老羅聽見了他們兩的討論,慢慢脫下帽子,摸了摸正在朝著“地中?!蹦J窖葸M(jìn)的烏黑的秀發(fā),說道:“那啥,服務(wù)器在驗(yàn)證登錄請(qǐng)求的時(shí)候,不管驗(yàn)證碼匹配還是不匹配,存在Redis里的驗(yàn)證碼只要被取出來就立即作廢,根本不給黑客暴力破解的機(jī)會(huì)?!?/p>

小李的團(tuán)隊(duì)已經(jīng)搭建好了Redis,用來存儲(chǔ)登錄過程中發(fā)給用戶的短信驗(yàn)證碼,是一個(gè)手機(jī)號(hào)和驗(yàn)證碼的鍵值對(duì)。

“對(duì)啊”,小李感覺眼前一亮,說道,“服務(wù)器在比對(duì)請(qǐng)求中的驗(yàn)證碼和Redis中保存的這個(gè)用戶手機(jī)號(hào)所對(duì)應(yīng)的驗(yàn)證碼的時(shí)候,如果發(fā)現(xiàn)不匹配,那依然還是直接把Redis中的這個(gè)驗(yàn)證碼作廢。這樣黑客發(fā)第二次登錄請(qǐng)求的時(shí)候,會(huì)因?yàn)镽edis中找不到對(duì)應(yīng)的記錄而登錄失敗。這樣既避免了暴力枚舉攻擊,同時(shí)也不再需要增加驗(yàn)證碼的強(qiáng)度,導(dǎo)致用戶體驗(yàn)的下降了?!?/p>

小李建議把剛才的討論結(jié)果寫到故事卡里,而薇薇提議能否不要立即作廢:“萬一用戶輸入驗(yàn)證碼的時(shí)候手滑輸錯(cuò)了,豈不是要等幾十秒的時(shí)間再重新發(fā)第二個(gè)驗(yàn)證碼?”

“可以做到驗(yàn)證碼3次輸入錯(cuò)誤后就作廢嗎?”薇薇問到。

“可以的,這個(gè)不難”小李堅(jiān)定的回答到。

“好,那我們加一條安全驗(yàn)收標(biāo)準(zhǔn)吧”,薇薇邊說邊修改了故事卡,新增加了一條:

保存于服務(wù)器端的驗(yàn)證碼,至多可被使用3次(無論和請(qǐng)求中的驗(yàn)證碼是否匹配),隨后立即作廢,以防止暴力攻擊

“對(duì)了小李”,老羅喝了口咖啡,最近連續(xù)的加班讓老羅感覺很疲憊,只能靠喝咖啡強(qiáng)打精神?!?0秒內(nèi)只能發(fā)1次短信那條,別忘了前后端都要做檢查?!?/p>

“知道知道,前端做不做都無所謂,關(guān)鍵是在后端要做限制。”小李連連點(diǎn)頭。

“好,那就這么做,去忙吧”。老羅轉(zhuǎn)身坐下,正準(zhǔn)備繼續(xù)剛才被打斷的工作,此時(shí)一個(gè)念頭快速在腦海里一閃而過,老羅在電腦上打開短信登錄的這張故事卡,從頭到尾又看了一次,最后目光停留在“短信驗(yàn)證碼有效期5分鐘”這條驗(yàn)收標(biāo)準(zhǔn)那里。

“短信每60秒發(fā)一次”,老羅心想:“但有效期是5分鐘,那第61秒的時(shí)候假如又請(qǐng)求發(fā)送一次驗(yàn)證碼,這時(shí)第一次發(fā)送的驗(yàn)證碼還沒過期,服務(wù)器端該怎么處理這個(gè)請(qǐng)求會(huì)比較穩(wěn)妥呢?

顯然,第二個(gè)驗(yàn)證碼直接覆蓋掉第一個(gè)會(huì)更加安全,也就是至始至終都只有一個(gè)處于有效狀態(tài)的驗(yàn)證碼,但這會(huì)不會(huì)給用戶帶來困惑?畢竟偶爾還是有手機(jī)信號(hào)不好,等了1分鐘多鐘之后才收到第一個(gè)驗(yàn)證碼的情況。

如果不替換而是追加驗(yàn)證碼呢?最極端的情況是會(huì)出現(xiàn)一個(gè)手機(jī)號(hào)有5個(gè)有效驗(yàn)證碼的情況,會(huì)增加黑客暴力破解的成功概率。不過因?yàn)橐粋€(gè)驗(yàn)證碼最多只能被使用3次,之后就被作廢了,所以實(shí)際上黑客暴力破解的難度依然很高。

總的來說,直接覆蓋的做法用戶體驗(yàn)不佳但更安全,依然有效的做法用戶體驗(yàn)更好但相對(duì)而言安全性略有降低?!?/p>

經(jīng)過反復(fù)思考后,老羅最終選擇保留驗(yàn)證碼5分鐘有效期的設(shè)置。

Part 2:防不勝防

短信驗(yàn)證碼登錄的功能上線后,運(yùn)行狀態(tài)一直比較平穩(wěn),然而這種平靜的氛圍被一通電話打破了。


“喂,對(duì),是我”,老羅桌上的電話響了,他忙著寫代碼,歪著脖子用肩膀和臉夾住話筒說道:“是客服部啊,有什么事我可以幫忙的?”

“是這樣,我們今天突然收到很多顧客打來的電話,抱怨說收不到短信驗(yàn)證碼,登錄不了賬戶,他們基本都是新用戶,只有用手機(jī)注冊(cè)的賬號(hào),沒有用戶名密碼,所以也不能用原先的用戶名密碼去登錄賬號(hào)。我們只好讓顧客再等會(huì)兒試試,可能是信號(hào)不好,但后來他們反饋說還是收不到我們的短信,而且只是收不到我們的短信,所以,你們那邊能幫忙看看是怎么回事嗎?”電話那邊一口氣講了一堆話。

“還有這種事,行,我知道了,我們馬上調(diào)查分析一下?!崩狭_剛掛斷電話,運(yùn)維部的同事過來找到老羅,說短信配額今天消耗得很厲害,已經(jīng)觸發(fā)了2次告警了,運(yùn)維同事做了一下簡單的分析,發(fā)現(xiàn)早上10點(diǎn)和下午2點(diǎn)左右有兩批次大量發(fā)送登錄短信驗(yàn)證碼的請(qǐng)求,但又沒有觀察到對(duì)應(yīng)的后續(xù)登錄請(qǐng)求,判斷可能是被黑客攻擊了,于是臨時(shí)性的屏蔽了攻擊來源IP地址的訪問。

“來找你就是想和開發(fā)團(tuán)隊(duì)共同調(diào)查下這個(gè)問題,看接下來怎么處理會(huì)比較好?!边\(yùn)維部的同事說道。

老羅覺得這個(gè)事和剛剛接到的客服部門說的是同一件事,便把剛才電話里聽到的信息和運(yùn)維同事講了一遍。

“這更能證實(shí)是黑客攻擊了,而且看來他們的目標(biāo)應(yīng)該不是暴力登錄,而是故意消耗短信發(fā)送配額,一旦配額被用完,用戶就無法正常登錄,也算是某種程度上的拒絕式服務(wù)攻擊了。” 運(yùn)維部的同事說完看向老羅。

老羅若有所思的說道:“沒想到他們還能這么玩兒。我們目前只限制了一個(gè)手機(jī)號(hào)60秒內(nèi)發(fā)一次驗(yàn)證碼,卻沒有應(yīng)對(duì)大量不同手機(jī)號(hào)的情況?!?/p>

“那現(xiàn)在怎么處理比較好呢?雖然臨時(shí)禁用了攻擊者的IP,但我們擔(dān)心會(huì)誤傷真實(shí)用戶,而且黑客也可能會(huì)變換IP來繼續(xù)進(jìn)行攻擊。”運(yùn)維同事繼續(xù)問道。

“有辦法,在發(fā)短信驗(yàn)證碼之前先要求輸入圖形驗(yàn)證碼?!?/p>

“嗯,有道理,你們什么時(shí)候能做好上線?”

“我現(xiàn)在就加”,老羅還沒說完就已經(jīng)開始寫代碼了:“一會(huì)兒弄完緊急上線。”

“行,我回去安排一下,咱們運(yùn)維部全力配合。”

“看來之前那張故事卡里的安全驗(yàn)收標(biāo)準(zhǔn)還差了一條”,老羅自然自語道:“如果加上一條圖形驗(yàn)證碼的要求恐怕就不會(huì)出這個(gè)事兒了?!?/p>

發(fā)送短信驗(yàn)證碼之前,先驗(yàn)證圖形驗(yàn)證碼是否正確

Part 3:權(quán)衡

“喂喂喂,這搞的什么鬼?”用戶體驗(yàn)設(shè)計(jì)師Jenny抓住路過的老羅說:“我不過就是休了兩天假,回來之后怎么發(fā)現(xiàn)登錄這里多了個(gè)圖形驗(yàn)證碼出來?”


老羅向Jenny解釋了這個(gè)圖形驗(yàn)證碼的由來,是出于安全的考慮才增加的。

“我知道安全很重要,可是這圖形驗(yàn)證碼太傷害用戶體驗(yàn)了,現(xiàn)在顧客登錄過程中就要再多做一次輸入,如果填錯(cuò)了還得重新再來一次,而且這圖形驗(yàn)證碼的風(fēng)格和我們的App風(fēng)格明顯不匹配,另外,這圖形驗(yàn)證碼是不是也太扭曲了,我都看錯(cuò)好幾回了……?!盝enny顯然并不認(rèn)同這個(gè)方案。

“風(fēng)格我們可以修改,這不是還有你嘛?!崩狭_為難的說到:“難度高是因?yàn)楝F(xiàn)在的圖像識(shí)別技術(shù)突飛猛進(jìn),簡單圖片驗(yàn)證碼很容易被破解?!?/p>

“莫非就沒有別的解決辦法了嗎?”Jenny繼續(xù)問道。

“其實(shí)也有,就看公司舍不舍得花這筆錢了。”老羅接著說:“登錄界面可以動(dòng)態(tài)決定是否要求輸入圖形驗(yàn)證碼,對(duì)于正常用戶可以讓他們無需輸入圖形驗(yàn)證碼,對(duì)于黑客或者疑似黑客的人,就要求他們輸入?!?/p>

“這聽上去很好啊,另外,這和舍不舍得花錢有什么關(guān)系?”Jenny不太明白。

“要?jiǎng)討B(tài)決定是否要求輸入圖形驗(yàn)證碼這件事兒,其實(shí)就是判斷當(dāng)前用我們App的人是真實(shí)的顧客還是黑客。我們自己沒這個(gè)判斷能力,不過有提供這種服務(wù)的第三方API,只是他們都不是免費(fèi)的,得花錢買?!崩狭_向Jenny解釋到。

阿某云和騰某云等等都提供這類服務(wù),其主要原理是,服務(wù)器在處理登錄請(qǐng)求的時(shí)候,先盡可能多的收集該請(qǐng)求的上下文信息,例如登錄請(qǐng)求的來源IP地址,時(shí)間,手機(jī)號(hào),User-Agent等等數(shù)據(jù),并且把這些數(shù)據(jù)傳遞給第三方API,由他們進(jìn)行一次分析判斷,并把結(jié)果返回給服務(wù)器,告訴服務(wù)器當(dāng)前請(qǐng)求者是可信用戶還是可疑用戶。最終是否允許登錄成功的決定權(quán)還是在服務(wù)器這邊,只是借助了第三方API提供的分析結(jié)果來做判斷而已。


“我不懂技術(shù),不過好像也聽懂了的樣子?!盝enny笑著說道。

“用第三方API做登錄判斷這事兒我拍不了板,得找領(lǐng)導(dǎo)批準(zhǔn),說不定還得走采購流程?!钡狭_覺得這條路的方向是對(duì)的。

“走,我們?nèi)枂栴I(lǐng)導(dǎo)的意見,我實(shí)在受不了現(xiàn)在這個(gè)圖形驗(yàn)證碼?!盝enny拉著老羅徑直朝著總經(jīng)理辦公室走去。

尾聲

最終,老羅他們團(tuán)隊(duì)用上了某云的第三方API做登錄防護(hù),去掉了令Jenny抓狂的圖形驗(yàn)證碼。經(jīng)過和業(yè)務(wù)部門的商量,驗(yàn)證碼有效期最后縮短到了2分鐘。

在這期間還出現(xiàn)了兩個(gè)小插曲。運(yùn)維部門的同事偶然間發(fā)現(xiàn),應(yīng)用程序日志文件里居然保存了所有用戶的短信驗(yàn)證碼,這是小李當(dāng)初做調(diào)試的時(shí)候加上去的,后來忘記關(guān)掉了。好在并沒有造成泄露,后來團(tuán)隊(duì)修復(fù)了這個(gè)問題。

另一個(gè)小插曲是,團(tuán)隊(duì)做了微服務(wù)架構(gòu)改造,把發(fā)送短信的功能拆分出來做成了一個(gè)獨(dú)立微服務(wù),但卻沒有給這個(gè)新的接口設(shè)置好訪問控制權(quán)限,以至于任何人在無需登錄的情況下,只要向這個(gè)接口發(fā)起請(qǐng)求就能成功發(fā)送一條短信給任意手機(jī),短信內(nèi)容還可以自定義。這個(gè)問題在安全團(tuán)隊(duì)做滲透測(cè)試的時(shí)候發(fā)現(xiàn)的,嚇得老羅渾身冒冷汗。所幸發(fā)現(xiàn)及時(shí),做了緊急修復(fù),并沒有造成安全事故。

薇薇后來把短信登錄的故事卡作為案例保存了起來,把安全驗(yàn)收標(biāo)準(zhǔn)又重新做了一次梳理,所以最終的故事卡是這樣的:

故事卡-274

作為用戶,我可以通過手機(jī)號(hào)和短信驗(yàn)證碼登錄,以便于我更方便的登錄。

安全驗(yàn)收標(biāo)準(zhǔn):

短信驗(yàn)證碼有效期2分鐘

驗(yàn)證碼為6位純數(shù)字

每個(gè)手機(jī)號(hào)60秒內(nèi)只能發(fā)送一次短信驗(yàn)證碼,且這一規(guī)則的校驗(yàn)必須在服務(wù)器端執(zhí)行

同一個(gè)手機(jī)號(hào)在同一時(shí)間內(nèi)可以有多個(gè)有效的短信驗(yàn)證碼

保存于服務(wù)器端的驗(yàn)證碼,至多可被使用3次(無論和請(qǐng)求中的驗(yàn)證碼是否匹配),隨后立即作廢,以防止暴力攻擊

短信驗(yàn)證碼不可直接記錄到日志文件

發(fā)送短信驗(yàn)證碼之前,先驗(yàn)證圖形驗(yàn)證碼是否正確(可選)

集成第三方API做登錄保護(hù)(可選)

沒成想,一個(gè)短信登錄API背后,還能牽扯出這么多事兒來。

當(dāng)前名稱:不就是個(gè)短信登錄API嘛,有這么復(fù)雜嗎?
轉(zhuǎn)載注明:http://www.bm7419.com/news/100208.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、網(wǎng)站內(nèi)鏈網(wǎng)站制作、自適應(yīng)網(wǎng)站品牌網(wǎng)站建設(shè)、網(wǎng)站維護(hù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)