一種簡單的REST API接口加密實現,只允許自己的產品調用後臺,防止接口被刷

在項目上線後,後臺接口很容易通過抓包工具看到, 難免被人爲構造惡意請求攻擊我們的系統,相信大家都或多或少都遇到過短信驗證碼被刷、瘋狂留言灌水、數據被惡意爬取等問題,這種直接抓接口然後寫個循環調用的行爲門檻極低,本文重點提供一種提高安全門檻的方法供大家參考。
後臺接口很容易暴露
1.實現思路:
客戶端通過將本地時間戳client_time_sign加密傳給後臺,後臺通過解密後和服務端時間server_time進行對比,在有效時間範圍內的話則說明是有效請求流程圖2.改造點:
老接口請求方式: http://www.abc123.com/getUserInfo?id=1
新接口請求方式: http://www.abc123.com/getUserInfo?id=1&client_time_sign=MEejo6tNI0aVlRrcKdOqDZAf
原來老接口抓到URL地址後可以任意調用,新接口URL地址調用過一次後,第二次再調用會提示請求非法,即使抓到了也不能重複發起請求。

2.1.前端控制器
在APP或者WEB應用的接口請求工具類或者攔截器中,拼接上client_time_sign參數,規則是直接對客戶端本地時間做AES加密(簡單做法,可以修改爲非對稱RSA加密或者使用更多鹽值一起加密)

2.2.後端攔截器
後端收到request請求後,獲取client_time_sign,通過服務端對參數AES解密拿到本次請求的客戶端時間戳,和服務端時間戳進行對比,server_time - client_time < ${legal_time} ,有效時間可以根據系統自身需要調高或調低,例如設置爲10s ,意思就是請求有效時間持續10秒, 在10秒內這個URL可以重複請求。
如果條件不成立,則可以直接返回異常提示給請求方。

注意事項:
這種實現方式有一個地方需要考慮,就是客戶端時間可能不一樣,本地時間是可以隨便被修改的,可能會導致正常請求無法被處理,這種情況下需要補正客戶端時間差,做法是在後端接口返回值字段中增加一個服務端系統時間server_time, 客戶端計算與服務端時間差值,補齊後再進行加密。

//客戶端時間補正方法
var globle = 0; //全局,並在app啓動時生成
function getGloble(sys_timestamp){ //入參爲後臺返回體中的t_
    if(globle == 0){
        var timestamp = (new Date()).getTime();
        globle = sys_timestamp - timestamp 
    }
    return globle ;
}

按照方案改造後, 只有自己的客戶端知道規則, 其他不知道校驗規則的拿到URL地址也沒用, 這樣基本能避免90%的濫刷接口行爲。

歷史文章
JAVA微信企業付款到零錢(十分鐘搞定)
微信授權獲取用戶openId的方法和步驟
一個微信號同時支持多個環境網頁授權
微信兩種簽名算法MD5和HMAC-SHA256

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章