2012-03-22 28 views
17

我們正在構建一個移動應用程序,並希望實施某種身份驗證,以確保API僅被我們的應用程序訪問。該應用程序的用戶是匿名的,沒有登錄,但我確實通過設備ID標識它們以維護設置等。如何確保API請求來自我們的移動(iOS/Android)應用程序?

最簡單的方法似乎是生成Guid/API密鑰,我通過SSL發送每個請求。

讓我擔心的是有很多空閒時間的惡意人會下載應用程序,反編譯它以獲取API密鑰和JSON請求,然後儘可能地垃圾我的數據庫。

SSL,一個API密鑰,一個設備ID和一個儘可能限制as-constrained-as-possible調用的API足夠好嗎?我應該採取不同的方法嗎?我的恐懼是成立的還是毫無根據的?

回答

18

不要在應用中嵌入單個API密鑰。您的擔憂對於惡意用戶的影響是有效的。此外,您目前的設置中存在一個嚴重的漏洞,您可以通過提供僞造的UDID讓惡意API用戶更改其他用戶的首選項。

取而代之的是,創建一個「註冊」服務,在設備上首次啓動應用程序時調用該服務,該設備根據UDID生成並返回一個GUID。將GUID存儲在設備本地用戶首選項和服務器上。跟蹤您的服務器上的每個請求的GUID並將其與UDID進行匹配。

確保所有這些都通過SSL進行。

使用這種方法沒有嵌入的主API密鑰被濫用。此外,您可以通過標記GUID/UDID組合來將濫用用戶列入黑名單,並且還可以消除現有註冊設備潛在僞裝問題。但是,您無法防止惡意註冊尚未向您的服務註冊的設備。這將永遠是使用設備ID作爲用戶標識符的潛在危險。

還有更好,更成熟的認證機制採取更好的方法,即。 OAuth,JSessionIDs等,你應該看看。

另外,將來您不應該使用UDID來標識您的用戶,因爲它的訪問權限已被棄用。您可以通過在應用程序安裝時在設備上創建自定義設備GUID並將其保存在本地用戶首選項中來達到您的目的模擬UDID。

+0

我不明白這是如何使任何更安全。脆弱點只在你的情況下有所不同:註冊服務。我可以攻擊,我也有完整的訪問權限。我認爲對於Android來說,至少也許可以這樣做:http://android-developers.blogspot.de/2013/01/verifying-back-end-calls-from-android.html – therealmarv 2016-08-10 10:09:33

+0

你會如何攻擊註冊服務獲得完全訪問權限? – 2016-08-10 14:56:16

相關問題