前後端分離,如何防止介面被其他人呼叫或惡意重發
前後端分離,如何防止介面被其他人呼叫或惡意重發?
首先,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
-
1. 加密,時間戳,每個包要有包序號,每次同向加1,收到重複序號認為是攻擊,可以抵禦重放攻擊。此外借助於HTTPS/TLS其自身機制,保證了訊息完整性,並且可以抵禦重放攻擊。由於加密,對方也無法看到明文內容。
-
2
2. 客戶端生成一串隨機數R1,發給伺服器,伺服器判斷此R1是否重複,之後根據演算法(R1+R2)生成金鑰。最好是結合驗籤機制。
-
3
3. https 會被中間人攻擊,Fiddler 能用替換證書的方式截獲並還原明文。非對稱加密(例如RSA)是個好辦法,不過你得防止別人直接反編譯你的程式碼分析出你的明文拼接方式。