給裸接口加一道防禦,避免惡意盜刷和爬取

WEB應用是開放的,WEB前端代碼也是公開的,和後端交互的接口若是沒有通過特殊處理(加密/token),那麼就是裸露的,只要知道api地址,那麼就能隨便獲取應用數據。這樣應用數據就很容易被人爬取或者惡意盜刷,典型的短信被惡意盜刷。html

公司理財產品的短信接口就是一個裸接口,只要手機號就能夠任意盜刷,固然背後有根據手機號,ip地址作了請求限制,但仍是不夠。後面就加了必定時間內必定請求次數的Token,後面觀察,基本沒有被刷的跡象,說明新的機制仍是起到很大做用。固然這個機制不只是用於防短信盜刷,可用於任意的裸接口防禦。前端

原理很簡單,就是在web頁面請求的時候由後端按必定的算法注入token到頁面中去,而後前端能夠經過對應的規則取到token,在請求接口數據時帶上去就能在後端對token進行驗證,驗證經過就能正常請求到數據。若是是native app ,可經過加密的方法請求接口來獲取token,最簡單直接的方式就是native app 客戶端使用一段字符串+時間戳(從後端獲取)進行加密,而後請求後端接口,接口對數據進行解密,對時間戳對比,在一段時間內認爲有效(避免加密信息被攔截,因此加了時間戳校驗),從而獲取token。node

固然web應用都是公開的,全部源碼理論上都是能獲取到的。那麼後端向web頁面注入token的方式也能被破解,因此,後端注入token的形式可定製,好比注入到請求,或者本身實現一套算法,增長被破解的難度。git

把這套機制整理成一個獨立的npm包access-token-api,方便多項目複用。github

npm install access-token-api

//server(nodejs)  端

var accessTokenApi = require('access-token-api');
var TokenApi = new accessTokenApi({
    webTokenVarName:'encrypt_api_tokenStr',//前端可經過webTokenVarName變量去到token值,默認encrypt_api_tokenStr
});

//web前端取token值
window[webTokenVarName] //請求接口時帶上這個值就能進行token校驗了

主要接口web

生成token api issue
驗證token api verify
token 有效次數減一 api decline
server 端 將token 注入到 web 前端頁面 api webInject

自定義後端注入token到web前端頁面的方式,能夠初始化模塊時自定義webInject參數(函數)算法

var TokenApi = new accessTokenApi({
    webInject:function(html,token,callback){
    var htmlEndIndex = html.indexOf('</html>');
      var tokenScript = '<script>window.' + this.config.webTokenVarName + '=' + token + '</script>';
      var prevHtml = html.substring(0,htmlEndIndex);
      var nextHtml = html.substr(htmlEndIndex); 
      prevHtml += tokenScript;
      prevHtml += nextHtml;
      callback(null,prevHtml);
    }
});

項目地址https://github.com/navyxie/access-token-api,裏面有express和sails框架的使用例子express

相關文章
相關標籤/搜索