2011-06-14 131 views
6

我想將用戶的認證信息保存在瀏覽器cookie中以進行持久登錄。正如他們所說,它絕對不可能將任何祕密信息(如密碼)存儲在cookie中,但爲了擁有諸如「記住密碼」之類的選項,我認爲沒有其他選擇。將登錄信息存儲在Cookie中

因此,如果用戶想記住他的登錄信息,並且我存儲了用戶名(電子郵件)+不是密碼,而是其他一些獨特信息,如Cookie中的HASHED DB ID。然後我應該檢查存儲在cookie中的哈希ID是否與存儲在Cookie中的用戶電子郵件相匹配。 正如我想任何人都可以很容易地看到存儲在瀏覽器中的cookie(例如在Firefox中,選項 - > Cookies)。

因此,這將是脆弱的,因爲有人從其保存的計算機中讀取cookie,然後在其他計算機上設置cookie並使用該信息登錄? (由於腳本將檢查存儲的電子郵件和數據庫哈希ID,它會匹配)?

這種方法能否在數據庫中不存儲其他信息(如會話ID等)的情況下進行改進? 謝謝

+1

一種方法是簡單地存儲用戶的ID在cookie中,而且還具有非持續性驗證的cookie。具有ID cookie但沒有經過身份驗證的cookie的用戶可以瀏覽您的系統,但第一次嘗試進行更改時會提示您輸入密碼。如果密碼正確,則認證的cookie將被設置,用戶不會再被詢問。由於cookie是非持久性的,認證只會持續到會話結束。 – GordonM 2011-06-14 08:04:15

+0

@GordonM,謝謝,我認爲amazon.com有相同的方法。我很想知道,如果您訪問cookie,可以說電子郵件+和一些散列信息,那麼您有多難在瀏覽器中設置這些cookie? – Roman 2011-06-14 08:15:28

+0

我會在cookie中存儲很少的東西。持久性ID cookie將僅使用有問題的用戶的ID,而非持久性認證cookie將爲真或假。儘量避免在cookie中存儲更多的信息,而不是完成任務所必需的信息,就好像您發送的只是一個窺探黑客必須繼續使用的ID,而如果您發送其他信息可能會給黑客更多線索攻擊你的系統。 – GordonM 2011-06-14 10:49:52

回答

11

還有另一種選擇。

對於每個用戶,在登錄,並要求必須記住,創建一個長的隨機字符串。

存儲這個字符串,與用戶id一起,在cookie你給用戶。
在數據庫中存儲字符串的正確含鹽散列。

如果用戶呈現記得,我的cookie,匹配隨機字符串,你在你的數據庫有散列驗證(就像它在那裏密碼)。

如果匹配 - >登錄的用戶,併爲他們創造一個新的記得,我的cookie。
如果不匹配 - >請求用戶名和密碼。

0

我會建議使用服務器上的唯一密鑰來加密用戶名(在這種情況下,電子郵件)並將其存儲在auth cookie中。如果cookie被篡改,將無法解密並導致登錄失敗。

如果將auth cookie(通過手動設置cookie或XSS)複製到另一臺計算機(或其他瀏覽器),則該用戶將在新計算機上登錄。您可以考慮添加一些關於計算機的獨特信息(如IP地址)以減少此類風險。

這是有關.NET中的身份驗證餅乾的交代,但我認爲這個概念適用於PHP,以及: http://support.microsoft.com/kb/910443

0

你沒有那麼多的選擇,當談到對存儲用戶信息客戶端...

你可以嘗試讓使用客戶端IP的關鍵部分加密。 即使cookie被複制到黑客的計算機,如果他沒有注意到該IP的加密的密鑰你就會有用戶信息的一些血統保護這種方式。

Facebook正在這樣做的事情,證明每次試圖從你必須去throught用戶驗證系統的另一個連接點登錄...

所以找一些可逆的加密,這應該讓你的天;)

+4

通過默默無聞的安全性完全沒有安全性。 – Gumbo 2011-06-14 08:07:40

+1

我會記住這一個^^ – MaxouMask 2011-06-14 09:02:42

0

有關於如何使「記住我」的好文章餅乾更安全:http://jaspan.com/improved%5Fpersistent%5Flogin%5Fcookie%5Fbest%5Fpractice

我已經實現在一個PHP庫在文章中介紹的方法:https://github.com/gbirke/rememberme,也許你可以使用作爲參考。

會話固定和餅乾偷竊是在Firesheep時代的一個現實問題。唯一的防禦措施就是通過SSL保護您的網站並監控XSS漏洞。

,以提高安全性的另一種方法是要記住,如果一個用戶登錄了「記住我」 cookie,並迫使他時,他做了「危險」像訂購或更換登錄憑據重新進行身份驗證。

更多的資源,看到這個問題:The definitive guide to form-based website authentication

+1

不幸的是,在第一篇鏈接文章中提出的改進沒有任何改進。他們寫的是對http://fishbowl.pastiche.org/2004/01/19/persistent_login_cookie_best_practice/的迴應,但很遺憾他們錯了。 – Jacco 2011-06-14 09:28:12

+0

你能解釋爲什麼嗎? – chiborg 2011-06-14 10:03:52

+0

評論框中沒有足夠的空間來詳細解釋。關於它的一些討論在魚缸文章下面,以及在[網站認證權威指南]的評論中(http://stackoverflow.com/questions/549/the-definitive-guide-to-website-authentication/ 477579#477579)。 – Jacco 2011-06-14 10:15:37

0

您還可以安裝帶有用戶名和SessionID的cookie中有過期時間戳。 然後,如果你綁定的cookie IP或主機名(或preferrably兩者)你是從餅乾竊取和其他的東西相當安全的。

0

我想沒有任何其他選擇

再想想。

你並不需要密碼客戶方存儲,以保持一個會話。 '記住我'的操作是一樣的 - 使用一個隨機值,它是服務器上保存的數據的查找鍵。

短期使用客戶端證書與密碼短語,其他任何你做的事情不會提高安全性複雜化,更容易暴露你的客戶的私人數據。