前后端分離,如何防止接口被其他人調用或惡意重發?
首先,http協議的無狀態特性決定了是無法徹底避免第三方調用你的后台服務。我們可以通過crsf、接口調用頻率、用戶行為分析(來源等)等各個方面來增加第三方調用的難度,也可以通過添加一個中間層比如node.js來實現;
1. 非法訪問通常使用認證來解決,方法很多session,token,oauth第三方框架等等。
(1)常規的方法:用戶登陸后生成token,返回客戶端,然后服務器使用AOP攔截controller方法,校驗token的有效性,每次token是一樣的;
(2)用戶登陸后生成臨時token,存到服務器,並返回客戶端,客戶端下次請求時把此token傳到服務器,驗證token是否有效,有效就登陸成功,並生成新的token返回給客戶端,讓客戶端在下一次請求的時候再傳回進行判斷,如此重復。 這種方法有性能問題,但也有一個漏洞,如果用戶在一次請求后,還未進行下一次請求就已被黑客攔截到登錄信息並進行假冒登錄,他一樣可以登錄成功並使用戶強制下線,但這種方法已大大減少被假冒登錄的機會。
(3)兩層token:一般第一次用賬號密碼登錄服務器會返回兩個token,時效長短不一樣,短的時效過了之后,發送時效長的token重新獲取一個短時效,如果都過期,那么就需要重新登錄了。當然更復雜你還可以做三層token,按照業務分不同token。
2. 對於合法的認證訪問,通常需要進行IP訪問頻率和次數的限制,各種API框架都有支持,比如Django restframework的throttling。
通常我們可以通過使用過濾器和緩存如redis來判斷訪問次數及頻率。在filter層加一個過濾器,攔截所有的請求,解析出請求的用戶,然后通過緩存,獲取到該用戶當前已訪問次數。而緩存,要求最好能夠自動超時回收,也就是說比如你想設定三分鍾內限制訪問次數,那么你記錄的緩存有效期就三分鍾就好了,過了三分鍾緩存自動失效,計數器也就重新從0開始了。類似於發短信的接口,每分鍾只能發一次;
3. 最外層的限制可能需要在nginx上配置rate limit。
參考自:http://blog.csdn.net/codercwm/article/details/58607420
http://blog.csdn.net/mylovepan/article/details/38894941