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