2013-02-07 48 views
0

我在學習RESTful接口。要更新服務器資源,說與(ID = 1)跟我說的那樣:RESTful PUT和黑客入侵的URL

PUT /contact/1 

現在假設當前用戶所屬組織1,擁有聯繫人1.還有組織2,與聯繫人2聯繫。當前用戶不屬於組織2,並且沒有權利。如果用戶攻擊網頁(使用Firebug for Mozilla或針對MSIE的「F12調試器」),並將網頁請求更改爲指向/ contact/2,瀏覽器將快樂地提交請求。

我的服務器必須防止這種跨組織攻擊。在我當前的網站設計中,一旦用戶登錄,我會在會話中存儲一個數據對象(我正在使用Tomcat/Java)。該對象存儲用戶屬於哪個組織。安全檢查代碼將組織傳回的PUT請求與用戶所屬的組織進行比較,並查看傳回的數據是否屬於用戶的組織。在檢測到黑客(組織1的用戶試圖修改屬於組織2的聯繫人2)時,會向瀏覽器返回錯誤。

據我所知,REST應該是無狀態的,但我目前正在使用某種狀態。然而,如果我將用戶信息傳遞到網頁中,我認爲這也可以通過Firebug et.al侵入。

如何在不調用服務器狀態的情況下實現這種安全性?

謝謝, 傑羅姆。

+1

您需要包括每個請求的認證,無論是作爲一個會話cookie或OAuth的風格特徵。 – SLaks

+0

@SLaks - 我恰好同意 - 謹慎地將您的評論擴展爲答案? – Perception

回答

0

RESTful服務通常是無狀態的。 這意味着每個請求都必須使用apikey或其他方法進行驗證。

所以請求將是/path?apikey=MYKEY並且服務器將處理該apikey的權限。

順便說一句,我也嘗試了有狀態的休息服務,並且服務器能夠通過在登錄期間初始化的cookie瞭解會話(但這不是真正的RESTful)。

如果您想嘗試,捲曲做這樣的事情:

curl -c cookie.txt -d "user=username&password=pass" "my.login.path" 
curl -b cookie.txt "do.something" 
+0

Aaaah,但你可以寫一個不能被黑客攻擊的cookie,說「我與org 1」?會話對象具有用戶不可觸及的優點。至於「每個請求進行身份驗證」,我希望這並不意味着每次都存儲在網頁中的用戶名/密碼。對於這一點,如果認證版本在網頁中存儲某種類型的散列(apikey),是不是要求服務器存儲與該用戶相同的密鑰?那也不是會話狀態嗎? –

+1

唯一可以幫助您形成「黑客」cookie的是https。 SSL是避免MIM攻擊的唯一方法。每個服務的認證意味着每次用戶做某事時,服務器都會拿apikey,看看用這個apikey的用戶是否可以做到這一點。這是無狀態的,因爲服務器不記得該用戶以前的任何操作。 – Enrichman

+0

告訴我,如果我有這方面的線索。我在用戶數據庫中有一個用戶名/密碼(可能只是一個密碼哈希)和一個不知何故生成的apikey。在登錄時,我通過用戶名/密碼組合查找用戶記錄,並獲取apikey,並通過cookie將其傳回給瀏覽器。未來的服務器請求會查找apikey以再次找到該用戶記錄,這會告訴我該用戶允許的組織訪問權限。如果所有這一切都是真的,是否還有超時機制,用戶需要在xx分鐘不活動後再次登錄?畢竟,我沒有使用Tomcat的會話管理。 –