2012-04-26 150 views
1

我正在研究一個大多是靜態的Web應用程序 - 只是HTML/CSS/JS +資產。我正在使用Rack服務器(實際上是Thin)來提供服務。保持API調用私有/受保護

雖然該應用程序大部分是靜態的,但有一些服務器端需求一直出現。由於應用程序需要通過JavaScript與這些需求進行交互,因此我已經將Sinatra添加到堆棧中,以便我可以輕鬆設置一些路線以充當簡單的API。

一個這樣的API調用是發送電子郵件 - 網絡應用程序需要一種發送電子郵件給用戶的方式。我設置了一個可以使用包含JSON對象的POST調用的路由(/ api/mail),Ruby將發送一封電子郵件(通過SendGrid)。

這是我的問題 - 本質上,這些API調用是公開的。大多數情況下,這很好 - 但通過電子郵件API,我想保護它,以便沒有人可以通過簡單POST開始發送惡意電子郵件,冒充我的應用程序。

問題是,我不太清楚如何驗證這一點。 Web應用程序本身就是客戶端,而不是用戶,所以密碼或API密鑰似乎毫無價值,因爲任何人都可以嗅探POST標頭並獲取應用程序發佈到API的憑據。

正在加密一切通過SSL我唯一的選擇,還是我錯過了一些明顯的解決方案?

+1

SSL如何幫助您?你想從誰那裏保護什麼? – ykaganovich 2012-04-26 05:41:34

+0

我試圖通過能夠進行簡單的公共POST調用來防止匿名用戶劫持我的電子郵件API。我不希望任何人能夠發送任何他們想要的電子郵件,原因有兩個 - 它會很昂貴,並且會有安全風險(惡意用戶冒充我的應用程序)。我認爲可以在POST中傳遞一個API密鑰(或密碼或其他東西),以驗證它是我的網站進行的呼叫,但它需要SSL加密以防止窺探POST頭中的密鑰。 – redhotvengeance 2012-04-26 05:46:07

+0

SSL將服務器認證到客戶端,並保持傳輸中的數據加密。但它不驗證客戶端。任何人都可以(a)打開瀏覽器並查看錶單頁面中嵌入的API密鑰,或者(b)編寫腳本下載表單頁面並以編程方式獲取。您可以密碼保護您的API的訪問權限(所以它基本上不再公開),但這只是表示您相信誰在您的系統上擁有帳戶。我認爲最基本的問題是,你想要把這個API稱爲誰。 – ykaganovich 2012-04-26 06:27:03

回答

2

在一天結束時,你所做的任何事情都可以很容易地被刮掉。我會通過ip和會話進行一些積極的速率限制,不要認爲其他任何事情都是可能的(或有效的)

+0

即使使用SSL,POST調用也可能被刮掉? – redhotvengeance 2012-04-26 05:41:26

+0

@idollar與SSL,你的網絡內的流量是加密的,但如果有人寫了一個瀏覽器機器人,比在這種情況下,你必須在服務器端做一些檢查,如馬特所說。 – Adeel 2012-04-26 05:45:25

+0

@Adeel那麼,我可以實現哪些服務器端檢查來驗證它是我的應用程序進行的調用,而不是一些隨機用戶進行POST?速率限制並不是一種解決方案,因爲我不希望任何人使用電子郵件API惡意構成我的應用程序,無論是1次還是1000次。 – redhotvengeance 2012-04-26 05:49:42