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