簡體   English   中英

如何設置安全cookie以指示用戶已登錄?

[英]How do I set a secure cookie to indicate a user is logged in?

目前,在用戶登錄后,我只需使用以下PHP代碼將用戶的ID號存儲在cookie中:

setcookie('userid', "$userid", time()+60*60*24*7*2, '/');

上面的代碼設置了一個持續2周的cookie,並包含非私有的用戶ID號(存儲在變量$ userid中)。 它還允許用戶保持登錄2周。 我知道這可能是設置cookie以指示用戶登錄的最不安全的方法之一,因為可以簡單地更改他或她的cookie參數並以他或她希望的任何用戶身份登錄。

因此,我如何設置一個cookie來完成我上面的cookie完成但也是安全的?

換句話說,對我來說,設置一個安全的cookie並允許我至少在他或她的會話期間識別用戶的ID號的最佳方式是什么? 我還希望cookie能夠持續2周,因此用戶無需繼續登錄我的網站。

改為使用會話 它會將一個會話ID存儲在cookie中,但所有實際數據都存儲在服務器上,因此沒有人可以搞亂它。

您還應該發送第二個cookie,即用戶唯一的哈希值。 例如,在第二個cookie存儲中,用戶ID,用戶名,密碼和salt值的哈希值。

md5($userId.$userName.$passwordHash.$userSalt);

由於您知道第一個cookie中的用戶ID,因此請在數據庫中查找該用戶。 第二個cookie應該用於驗證用戶ID。 如果哈希cookie值不完全匹配,您知道您的服務器沒有提供第二個cookie,您應該拒絕隱式登錄請求。

使用安全哈希(僅限服務器已知)與特定於用戶的某些數據組合並創建哈希。 將其保存為值而不是id。 收到請求時,通過重新生成來比較哈希。 請注意,它仍然容易受到XSS attach或CSRF的攻擊。 如果你擔心,那么也要解決這些問題。 Cookie是存儲數據的不好方法,以上將停止的是有人只是將cookie設置為隨機用戶ID並登錄。

這是您想要自動登錄並將其與會話ID分開。 如果不這樣做,其他答案建議並使用會話。

成功登錄后,所有用戶數據必須存儲在會話中。 當你調用session_start() ,將生成一個唯一的id,它將被存儲在瀏覽器cookie中。每次瀏覽器發出請求時,它都會將cookie中的值與它一起發送。為了更強的安全性,你可以在成功后regenerate會話ID登錄。

您也可以使用mcrypt來加密cookie中的某些數據,這是我在cookie中存儲內容的首選方式。

如果您出於某種目的需要它,那么只需解密它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM