2012-04-05 133 views
2

也許我正在尋求一些不可能的東西,但是我們在這裏試着找到一種方法來驗證對API的客戶端請求,但有些客戶端只能使用JavaScript發送他們的請求(他們使用不允許寫一行服務器端代碼的託管服務)。這意味着任何API密鑰,祕密或散列必須由JavaScript處理,實際上使它們無用。保護僅限JavaScript的客戶端以訪問遠程API

我已經看到一些使用嚴重混淆代碼的API,但在我看來,這種方法會帶來錯誤的安全感(可以通過JavaScript Beautifier輕鬆閱讀)。有沒有更好的方法?

在此先感謝所有的答案。

+1

如果客戶端通過普通身份驗證過程(當然是https),並建立會話,那麼ajax API訪問將是安全的。這不夠好嗎? – Pointy 2012-04-05 20:53:45

+0

@Pointy問題在於客戶端仍然需要以某種方式進行身份驗證,並且這意味着需要以純文本方式傳遞憑據(通過JavaScript,再次)。身份驗證不需要任何用戶交互。 – Diego 2012-04-05 21:06:26

+0

@Diego是當我第一次閱讀時,我誤解了這種情況。如果沒有涉及用戶提供的「祕密」,並且JavaScript必須自動進行身份驗證,那麼您無法隱藏任何東西。 – Pointy 2012-04-05 21:08:15

回答

2

不,JavaScript是開放的,這意味着零安全性。

最明智的做法是通過您擁有的服務器來代理API,然後讓人們用自己的密鑰註冊服務器。

這意味着即使他們沒有任何服務器端代碼,也沒關係,因爲您爲他們託管服務器。

+0

是的,JavaScript是開放的,但即使是單頁全JavaScript網站也可以使用普通的身份驗證技術來建立安全會話。當然,如果這是某種JSONP的東西,那麼是的,這是不可能保密的安全信息。 – Pointy 2012-04-05 20:54:26

+0

@Pointy true,但是這需要一個服務器,他沒有一個 – Raynos 2012-04-05 20:57:55

+0

啊好吧我只是重新讀了第一段;起初我誤解了。 – Pointy 2012-04-05 20:58:25

2

真的沒有辦法完全用JavaScript做到這一點。我曾經使用過的唯一選項是IP地址限制或的某些其他形式的JavaScript客戶端。在認證/授權之後,然後通過HTTPS將它們的祕密密鑰傳給它們,只保留在客戶端上一點(即不存儲在任何地方)。

缺點是聰明的惡意用戶可以很容易地調試到JavaScript並確定這個關鍵。

+0

感謝您的建議。不幸的是,JavaScript會運行在客戶端的瀏覽器上,因此我無法預測IP並對其進行過濾。關於HTTPS,在這種情況下它將無濟於事,因爲所有請求都將通過JavaScript獨特發送,因此任何人都可以看到。正如你所確認的,沒有辦法只用JavaScript來做,這證實了我的想法。 – Diego 2012-04-05 21:14:43