在項目上線后,后臺接口很容易通過抓包工具看到, 難免被人為構(gòu)造惡意請求攻擊我們的系統(tǒng)蓖租,相信大家都或多或少都遇到過短信驗證碼被刷、瘋狂留言灌水羊壹、數(shù)據(jù)被惡意爬取等問題菜秦,這種直接抓接口然后寫個循環(huán)調(diào)用的行為門檻極低,本文重點提供一種提高安全門檻的方法供大家參考舶掖。
1.實現(xiàn)思路:
客戶端通過將本地時間戳client_time_sign加密傳給后臺球昨,后臺通過解密后和服務(wù)端時間server_time進行對比,在有效時間范圍內(nèi)的話則說明是有效請求
老接口請求方式: http://www.abc123.com/getUserInfo?id=1
新接口請求方式: http://www.abc123.com/getUserInfo?id=1&client_time_sign=MEejo6tNI0aVlRrcKdOqDZAf
原來老接口抓到URL地址后可以任意調(diào)用眨攘,新接口URL地址調(diào)用過一次后主慰,第二次再調(diào)用會提示請求非法,即使抓到了也不能重復(fù)發(fā)起請求鲫售。
2.1.前端控制器
在APP或者WEB應(yīng)用的接口請求工具類或者攔截器中共螺,拼接上client_time_sign參數(shù),規(guī)則是直接對客戶端本地時間做AES加密(簡單做法情竹,可以修改為非對稱RSA加密或者使用更多鹽值一起加密)
2.2.后端攔截器
后端收到request請求后藐不,獲取client_time_sign,通過服務(wù)端對參數(shù)AES解密拿到本次請求的客戶端時間戳,和服務(wù)端時間戳進行對比雏蛮,server_time - client_time < ${legal_time} 涎嚼,有效時間可以根據(jù)系統(tǒng)自身需要調(diào)高或調(diào)低,例如設(shè)置為10s 挑秉,意思就是請求有效時間持續(xù)10秒法梯, 在10秒內(nèi)這個URL可以重復(fù)請求。
如果條件不成立犀概,則可以直接返回異常提示給請求方立哑。
注意事項:
這種實現(xiàn)方式有一個地方需要考慮,就是客戶端時間可能不一樣姻灶,本地時間是可以隨便被修改的铛绰,可能會導(dǎo)致正常請求無法被處理,這種情況下需要補正客戶端時間差产喉,做法是在后端接口返回值字段中增加一個服務(wù)端系統(tǒng)時間server_time捂掰, 客戶端計算與服務(wù)端時間差值,補齊后再進行加密镊叁。
//客戶端時間補正方法
var globle = 0; //全局,并在app啟動時生成
function getGloble(sys_timestamp){ //入?yún)楹笈_返回體中的t_
if(globle == 0){
var timestamp = (new Date()).getTime();
globle = sys_timestamp - timestamp
}
return globle ;
}
按照方案改造后走触, 只有自己的客戶端知道規(guī)則晦譬, 其他不知道校驗規(guī)則的拿到URL地址也沒用, 這樣基本能避免90%的濫刷接口行為互广。
歷史文章:
JAVA微信企業(yè)付款到零錢(十分鐘搞定)
微信授權(quán)獲取用戶openId的方法和步驟
一個微信號同時支持多個環(huán)境網(wǎng)頁授權(quán)
微信兩種簽名算法MD5和HMAC-SHA256