項(xiàng)目中遇到這樣一個(gè)場(chǎng)景:
1.有個(gè)頁(yè)面需要先輸入用戶手機(jī)號(hào),然后發(fā)送短信驗(yàn)證碼;
2.輸入完短信驗(yàn)證碼后,再?gòu)棾鲆粋€(gè)交易密碼的彈框;
后臺(tái)把這兩步分別使用2個(gè)接口來(lái)校驗(yàn)信息,第一個(gè)接口傳入?yún)?shù) 手機(jī)號(hào)和短信驗(yàn)證碼,校驗(yàn)成功彈出窗口繼續(xù)輸入交易密碼,輸完后調(diào)用接口傳人參數(shù) 交易密碼 校驗(yàn)交易密碼,校驗(yàn)成功即可支付了! 哈哈哈,真開心,大功告成?
對(duì)于上面的操作流程認(rèn)真分析一下,有沒(méi)有不安全的隱患存在呢?下面簡(jiǎn)單說(shuō)說(shuō)我個(gè)人看法:
1.第一步校驗(yàn)手機(jī)號(hào)和短信驗(yàn)證碼 肯定是沒(méi)有疑問(wèn),這一步校驗(yàn)?zāi)康氖潜WC當(dāng)前操作人一定是本人(手機(jī)丟了這種情況暫時(shí)不考慮);
2.第二步校驗(yàn)僅僅傳人校驗(yàn)密碼,這樣就會(huì)留下一個(gè)隱患,當(dāng)有人且本人知道了該用戶的交易密碼直接使用工具(非APP)直接去調(diào)用第二個(gè)接口,那也肯定能夠校驗(yàn)通過(guò),可能有人會(huì)說(shuō)我報(bào)文頭加session機(jī)制防止工具直接調(diào)用接口;那就不得不考慮到更牛逼點(diǎn)壞人,他能夠破解APP,把APP第一步校驗(yàn)手機(jī)號(hào)(可以理解為這一步就是用來(lái)確定是不是本人操作)注釋掉了,那后面就照樣可以通過(guò)了!或許大家覺(jué)得這些情況太極端了,確實(shí)我也認(rèn)為又能夠破解APP又還能搞到你交易密碼這種人極少。
我的處理方式:
第一種:如果你的手機(jī)號(hào)和短信驗(yàn)證碼 還有交易密碼都在同一個(gè)頁(yè)面,那么后臺(tái)就把這2個(gè)接口合并成一個(gè)接口來(lái)同時(shí)校驗(yàn)這三個(gè)參數(shù);
第二種:如果手機(jī)號(hào),短信驗(yàn)證碼 和交易密碼不在同一個(gè)頁(yè)面,那么還是使用兩個(gè)接口去校驗(yàn),但是第二個(gè)接口還必須將手機(jī)號(hào) 短信驗(yàn)證碼還有交易密碼都傳入了一起校驗(yàn)。
這樣用兩個(gè)接口校驗(yàn)的好處:先校驗(yàn)短信驗(yàn)證碼了就可以避免用戶在短信驗(yàn)證碼頁(yè)面輸錯(cuò)了,自己還沒(méi)發(fā)現(xiàn),繼續(xù)去輸入交易密碼,輸完了去提交校驗(yàn)時(shí)候才發(fā)現(xiàn)短信驗(yàn)證碼錯(cuò)誤了,又用返回到上個(gè)頁(yè)面,這樣從用戶體驗(yàn)角度考慮并不友好。
建議使用第二種方式,可擴(kuò)展性更強(qiáng)一些。
前面說(shuō)那么牛逼的壞蛋可能很少,那為什么還考慮這么多呢,我是想跟大家講一個(gè)后臺(tái)接口定義原則:外圍判定只能用作外圍校驗(yàn)使用,不允許當(dāng)作內(nèi)部系統(tǒng)判斷標(biāo)準(zhǔn)。
什么意思?
可以把后臺(tái)之外的都當(dāng)做外圍系統(tǒng),比方說(shuō)web前端,APP端等,就剛剛這個(gè)場(chǎng)景 校驗(yàn)手機(jī)號(hào)和短信驗(yàn)證碼 就是在判斷是否是本人,如果按我最開始的處理方式,我第一步校驗(yàn)成功了去第二步操作,僅僅傳人交易密碼其實(shí)就是將前端得到的結(jié)果,現(xiàn)在操作用戶為本人這個(gè)結(jié)果直接給后臺(tái),后臺(tái)直接使用了這個(gè)結(jié)果,沒(méi)有再去校驗(yàn)一遍,就出問(wèn)題啦!可能這里理解起來(lái)有點(diǎn)亂,不妨去想想當(dāng)使用優(yōu)酷APP看視頻,你去看VIP資源的時(shí)候,本來(lái)APP從登錄后就知道你是不是VIP,那后臺(tái)是不是就不用再校驗(yàn)?zāi)闶遣皇钦娴腣IP呢,就寫這么多吧,慢慢體會(huì)!