2013-06-12 89 views
1

我有一個使用REST API的web應用程序。我希望與更廣泛的世界分享這個API,但在此之前,我需要添加速率限制以防止錯誤客戶端的濫用/高負載。我想爲自己的web應用程序制定一個例外,所以它有一個更高的限制。速率限制API有一個特殊的例外

有沒有合理的方法來做到這一點?不尋找100%的防彈解決方案,但也許只是使API更難以利用。

請記住,Web應用程序是公開的,所以我不能僅僅依靠API令牌的速率限制,因爲有人可以使用相同的標記。

回答

1

由於Web應用程序無法向用戶隱藏任何東西,我不認爲有一種方法可以確保應用程序與您的API對話是您的。

您可以做的所有事情都是通過默默無聞的安全措施實現的安全措施。

編輯

我想有一個解決方案,仍不能保證,但是這將是一個想法。

首先要有兩個認證系統。

  1. 第三方認證(API令牌)
  2. 的Web應用程序的身份驗證(API令牌+網絡令牌)

然後,它有點像你的想法。您爲每個HTTP會話生成一個令牌。區別在於網絡應用程序(通話身份驗證)將具有下限。 (例如第三方的10k和網絡應用的1k)。 您應該減少授權的呼叫次數的原因是因爲一個HTTP會話(1個人)應該比第三方應用程序生成更少的API調用。是你的情況嗎?

當然,第三方應用程序可以很容易地將自己認證爲一個網絡應用程序,但它必須更快地更新其會話,因此您可以監視每個IP的會話數量。 請注意,大學和公司通常在很多IP背後。

+1

下面是一個潛在的解決方案:當用戶最初加載webapp時,webapp在會話中存儲一段時間後過期的令牌,例如,一週。然後將該標記提供給javascript,然後可以將其作爲查詢參數傳遞給API。 API會檢測此令牌是否與會話存儲值匹配,如果是,則會增加或刪除速率限制。據我所知,這並不完美,但是想要利用API的人不得不求助於屏幕抓取。 – ysimonson

+0

該解決方案並不安全,因爲您可以輕鬆從會話ID獲取令牌並將其作爲查詢參數。您只需分析它是如何實現的,並在應用程序(第三方)上以相同的方式實現它。看?但我有一個想法,我會盡快將其添加到我的文章。 – basgys

+0

是的,我意識到這不是100%安全,只是尋找一些沙袋。我喜歡你的想法。將研究它。 – ysimonson

0

取決於。你想限制每個人還是同一個用戶?在第一種情況下,只需跟蹤最後一次通話發生的時間,並在最後10秒內避免通話(或按照您的意願)。在第二種情況下,您還必須檢查用戶,並跟蹤會話或令牌。

+0

它應該在每個會話的基礎上進行限制,但其中一些會話可能未經過身份驗證。似乎與如何使用不同的速率限制層無關,特別是因爲許多API請求客戶端不保留Cookie並因此在每個請求上重置會話。 – ysimonson