2013-02-27 52 views
0

我正在用Slim Microframework編寫一個REST風格的Webservice,並使用GET從mysql數據庫讀取數據(選擇查詢)以及POST/PUT/DELETE插入/更新/刪除數據庫中的行。帶有Slim框架的PHP RESTful Webservice,認證需要還是反對無狀態?

我的問題是現在,如果每個人都能夠寫入或刪除數據庫中的數據,這不是一個很大的安全問題嗎?但是我怎麼能夠阻止呢?我認爲REST中的ST代表狀態轉移(所以webservice是無狀態的),這與一個狀態是否存在矛盾。如果我將允許在數據庫中寫入的客戶端傳遞一些登錄數據,那麼一個壞人是否可以通過它獲取logindata和假請求,例如刪除所有條目?

那麼,最簡​​單的方法是什麼,我發現的唯一Slim Framework示例總是顯示路由示例,但不是如何保護它。

在Slim Framework中是否還有一些機會來實現我所需要的?它應該儘可能簡單,並且要求的響應速度幾乎與沒有認證或類似的響應一樣快。沒有像密碼這樣的敏感數據,對我來說,只需使用cURL命令行工具的每個人都可以刪除所有行或類似的東西就足夠了。

如果有人能解釋我該做什麼和/或舉例說明,那將會很棒。我還需要知道,我可能需要在允許發送請求的客戶機上進行更改。

非常感謝。

回答

0

這將是無狀態的,從某種意義上說,不會有會話或cookie,真的。您通常會發出一個INSERT/UPDATE/DELETE所需的密鑰。

然後由您來爲每個請求傳遞密鑰並確定密鑰何時應該過期。

+0

我想通了,這是使用apikey調用。但是我在Slim框架中找不到一個開箱即用的解決方案。相反,我發現框架作者的Git倉庫有一些Slim Extras,例如HTTPbasicAuth。在這裏找到︰https://github.com/codeguy/Slim-Extras/tree/master/Middleware現在我的問題是,如果我可以使用這個,而不是一個鍵,或者這不是在數據庫中插入/更新的權利。一個壞人是否仍然可以嗅探身份驗證數據(或者密鑰)和虛假請求?謝謝。 – 2013-02-27 16:02:23

+0

http://www.thebuzzmedia.com/designing-a-secure-rest-api-without-oauth-authentication/ – Rawkode 2013-02-27 16:07:17

+0

感謝這個鏈接,但它不是關於使用Slim框架。那我上面問的HTTPbasicAuth呢?我正在尋找Slim中的一些東西,但不確定這些東西是否有用。 Thx再次 – 2013-02-27 20:21:23

1

每個請求都必須經過認證和授權。

人們經常被「無國籍」這個詞捆綁在一起。這實際上意味着從一個請求到另一個請求,RESTful服務沒有預先知道用戶狀態。

但是,該服務顯然允許知道剛發出請求的已認證用戶,否則它將如何決定是否允許訪問?

因此,您可以在每次請求期間將經過身份驗證的用戶「存儲」在某個變量中。然後,您將如何使用這些信息來授權請求​​。

我喜歡保持簡單,並將我的所有用戶作爲我的URI鏈中的資源。他們提出要求,如users/{username}/someresource

我使用http基本身份驗證(通過SSL)進行身份驗證並基於URI進行授權。如果請求認證失敗,則爲401未授權請求。如果URI {用戶名}和認證的{用戶名}不匹配,請求是403禁止的。如果它被認證並被授權,則允許該請求(http代碼取決於http動詞)

現在這是覆蓋的Web服務,現在轉到Web服務客戶端。這當然需要存儲狀態,否則你的用戶每次發出請求都必須登錄。

您只需將用戶會話存儲在應用程序中(按照正常會話管理),並在會話中存儲用戶名和密碼(當然是加密的)。現在,每次發出請求時,Web服務客戶端都需要檢索用戶名和密碼,並將請求發送給Web服務。

0

它會像正常http認證的會話一樣安全。這些使用cookie等認證連接的用戶到存儲的會話狀態。

無狀態服務將沒有什麼不同 - 令牌被傳遞給服務,就像標記存儲在cookie中的普通http一樣。如果你擔心嗅探(IE中間人攻擊),你可以通過SSL保護鏈接。

該服務生成的身份驗證令牌將被加密,並且會包含一個鹽,並在服務器上爲每個請求驗證。您還可以限制會話時間以適應您的偏執狂,並檢查源IP,用戶代理等的變化,並在用戶令牌發生更改時終止用戶令牌。

0

我最近遇到類似的問題。按照這裏的人們的建議,我決定使用OAuth身份驗證。

我使用HybridAuth一個PHP包裝器的OAuth和出爲Facebook,Twitter的,谷歌,LinkedIn液箱式標牌的,等