2012-01-20 54 views
13

我有一個合理完整的REST服務,並將與iOS應用程序一起使用。它是使用Ruby/Sinatra構建的,但我認爲這並不重要。如何保護REST服務的「公共」部分免受垃圾郵件侵害?

我通過SSL爲各種端點使用HTTP基本身份驗證,該部分工作得很好。

問題是: 如何阻止垃圾郵件發送者等調用未通過HTTP基本認證保護的REST服務的某些部分?

示例:用戶註冊

讓我們假設REST呼叫是(POST).../register_account傳遞JSON對象在體內。

由於顯而易見的原因,此調用不能期望鏈接到用戶帳戶的用戶名/密碼。

思路是:

1)應用程序有其自己的「用戶名」 /密碼,一些通話將檢查應用程序的憑據。 問題:啓動設備等可能會發現這些憑據。

2)應用程序通過HTTP標頭將祕密標記傳遞給REST服務以進行這些調用。 問題:與(1)相同

是否有任何常用於防止此類垃圾郵件呼叫的技術?我想可能會在iPhone中引入iPhone的設備ID,但尚未確定明確的方法。

感謝

回答

5

雖然針對垃圾郵件的第一道防線是特定於應用程序的代碼的好主意,但您仍應該對所關注的任何服務實施一些速率限制。

例如,如果您在REST服務上使用會話,則可以輕鬆限制您從單個會話處理的呼叫數量。該會話根本不需要進行身份驗證,僅用於在提出請求時識別單個客戶端。如果他們嘗試在沒有開放會話的情況下進行連接,則簡單重定向回所請求的服務即可,並且實際上所有web框架或堆棧都內置此功能。

您也可以對其他屬性進行速率限制,例如IP或用戶代理指紋,但這些不如基於會話的方法可靠。

+0

進行比較。我將使用這個gem:https://github.com/datagraph/rack-throttle進行速率限制。我將繼承它,以便客戶端標識符是設備ID + IP地址的組合。也將堅持應用憑證的想法。 – Riaz

-2

可以用request.ip寫周圍的一些邏輯跟蹤IP地址。

+0

錯誤; NAT後面有很多人,因此大量不相關的請求可能來自單個IP。 – mbq

+1

是真的。但我可以結合移動/平板設備ID和IP中的哈希來生成一個唯一的令牌來與 – Riaz

3

一般來說,一種常用的方法是API密鑰,它與您在上面描述的祕密標記相同。您可以將其硬編碼到您的應用程序中,並使其難以對其進行逆向工程(隱藏它,從存儲在應用程序中不同位置的各個部分構建它)等。你是正確的,一個堅定的攻擊者將能夠恢復密鑰(如果你的應用程序可以這樣做,其他人也可以訪問你的應用程序),但你可以使它變得更加困難,希望它可以不值得花時間和精力這樣做。

您也可以查看部署相互認證的SSL,以便您的服務器只接受來自應用的傳入連接,並且您的應用只會與您的服務器進行通信。

這是高層次的方法。創建一個自簽名服務器SSL證書並部署到您的Web服務器上。然後創建一個自簽名客戶端並將其作爲資源部署到您的應用程序中。將服務器配置爲需要客戶端SSL身份驗證,並僅接受您生成的客戶端證書。配置客戶端使用該客戶端證書來標識自身,並且只接受您在服務器上安裝的那一部分服務器端證書。

如果您的應用程序以外的某個人/某個人嘗試連接到您的服務器,則SSL連接將不會被創建,因爲服務器將拒絕未顯示您已包含在您的應用程序中的客戶端證書的傳入SSL連接。

相關問題