2010-04-26 73 views
5

我是一個服務器端編程的新手,所以請原諒我,如果這變得凌亂。我已簽約創建一個Web服務,以允許經過身份驗證的用戶訪問數據庫。用戶必須輸入登錄名和密碼。一直在閱讀和閱讀關於REST vs SOAP的內容,當我遇到這個陳述時,我想我已經解決了一個RESTful設計:「需要安全的數據不應該作爲URI中的參數發送。」這似乎是對RESTful方法的一大缺點。我知道,使用https密碼將被加密以防止中間人進行攔截,但這會使服務器日誌和客戶端歷史記錄成爲可能的暴露點。有沒有一個RESTful的解決方案,這個問題,還是我需要去SOAPY?任何建議讚賞。如何在REST風格的Web服務URI中保護密碼參數?

+1

你爲什麼要通過URI傳遞密碼,這明顯是未加密的純文本?如果是這種情況,那麼爲什麼即使打擾密碼呢? – 2010-04-26 18:56:54

+0

就像我說的,我是一個新手。在研究Web服務和REST vs SOAP時,似乎正在出現的共識是REST更簡單,適用於大多數場景。在試圖確定什麼屬於「大多數情況下」,什麼不是,我認爲我發現了與認證異常;即在RESTful設計中,所有內容都通過URI或標頭傳遞,這兩者都是脆弱的。所以我只是想知道這是否屬實,或者是否有安全和RESTful的方式來使用用戶名和密碼進行身份驗證。 – adam 2010-04-28 16:28:19

回答

1

使用POST類型的請求來傳輸必要的數據,並將敏感部分包含爲發佈字段,以便它是請求主體的一部分而不是URI中的參數。

+0

我不知道這有什麼幫助。你能詳細說明一下嗎? POST不會通過URI傳遞數據,但它仍然會被傳遞。 HTTPS負責端到端的數據加密,但如果以純文本格式存儲密碼,則不會有太大的作用。 – Krisc 2010-04-26 17:16:44

+1

OP的問題涉及數據的傳輸,而不是將其存儲在服務器上。不在URI中傳遞安全數據的主要原因是,URI通常由您的個人應用程序以外的事物記錄,比如Web服務器請求日誌和瀏覽器歷史記錄。相比之下,這些日誌和歷史記錄通常不記錄POST字段。 – Amber 2010-04-26 17:32:34

+0

如果你確實需要登錄POST字段,你可以[加密日誌文件](http://stackoverflow.com/questions/629755/creating-an-encrypted-log-file) – 2011-12-01 02:25:53

0

這是配置您的Web服務器而不是您的應用程序的問題。錯誤配置會導致漏洞,這就是一個很好的例子。 Web服務器也可以記錄POST請求,如果您的Web應用程序防火牆檢測到攻擊,這很常見。我會確保在apache中關閉日誌記錄功能,因爲這可能不是您的應用程序正常運行所必需的。

另一個更常見的方法是使用cookie來維護會話。 Cookie仍然需要使用https保護其整個生命。

1

我認爲,要真正RESTful,您應該使用HTTP身份驗證(基本或摘要),因爲被迫首先登錄不符合REST的精神。但是,我希望這可以由知道REST的人確認(或駁斥)。

+1

其實隨着REST的發展,像肥皂一樣嚴格,這會解決他的問題。只要確保使用https。 – rook 2010-04-26 18:53:16

+1

另一種選擇是使用客戶端證書。您將服務器配置爲只接受使用您批准的證書或由您批准的證書頒發機構頒發的證書進行的請求。在需要公共訪問的情況下,這可能並不實際,但在您想要控制客戶端列表的情況下,這是非常安全的。 – stand 2011-04-25 20:05:37

+0

@stand true。理想情況下,它是*解決方案。但是,正如你所說,公共訪問不是「真實世界」。 – p4bl0 2011-04-25 20:35:06