2012-11-06 19 views
1

我在一個項目的開始,當用戶驗證時將有一個「記住我」選項。用PHP創建一個「記得我」系統的安全方式是什麼?

我的用戶的數據庫表有認證的基本結構如下:

  • ID:當用戶註冊產生的隨機數。 (密鑰)
  • 用戶名:用戶選擇的用戶名,可以更改爲另一個唯一的用戶名。
  • 散列:設置密碼時用「phpass」創建的密碼的散列。

我想知道一種安全的方式來保持用戶使用cookie和MySQL登錄,即使在多臺計算機上。

我希望我可以使用相同的cookie來存儲臨時會話或「記住我」部分。我已閱讀有關令牌並將所有用戶信息散列到cookie中,但安全嗎?我檢查了用戶認證後使用的Facebook Cookie,並且存在用戶ID條目,對於我想做的事情是否真的有必要?

如果我決定散列信息到cookie,我應該使用「phpass」可能是較慢或簡單的MD5函數,看到驗證驗證將在每個頁面和每個AJAX請求?每次我驗證登錄時,是否應該續訂用戶令牌?

最後,我有什麼最好的選擇?我知道有很多類似的問題,但我沒有找到像這樣做的最佳方式。在我發現的每一篇文章中,關於這個主題都有不同和矛盾的地方。我想知道一個安全和乾淨的方式來做到這一點。

回答

2

我建議使用單獨的表來存儲保存的登錄會話。此表格將存儲在用戶選擇「記住我」時生成的唯一散列,用戶的IP地址和他們的user_id。

何時或如果用戶決定保留持久登錄,您將生成散列,將該散列保存爲cookie值,並將其IP/user_id存儲在「已記憶」表中。

在您的session_start/check序列中,首先檢查會話是否已設置 - 如果沒有,檢查cookie是否已設置 - 如果設置了cookie,則將其IP地址與cookie的哈希值對數據庫進行匹配,出,將他們的會話狀態設置爲「已認證」。

使用其IP地址和唯一哈希表的原因是允許多個設備/計算機持久存在。每個設備在remembered_sessions表中都有一個條目。

此方法不在cookie中存儲任何密碼,只有成功輸入密碼的用戶才能在自己的計算機上使用該cookie。此外,即使某人在其cookie中抓取了該用戶的哈希,他們也需要位於同一網絡才能被認證。

+1

我還建議將用戶標識存儲在cookie中 – zerkms

+1

有動態IP的連接有問題 –

+0

如果您要保護安全性,那麼這是一個很小的代價。 –

相關問題