簡體   English   中英

PHP登錄會話和cookie

[英]PHP login session and cookie

在我的PHP網站上,用戶可以登錄並有可能選中“記住我”來設置cookie。

我應該將什么存儲為SESSION變量? 用戶名,散列密碼和user ID ,或僅user ID 如果我只存儲user ID ,那么有人可以編輯SESSION並更改ID嗎?

COOKIE怎么樣? 我應該只存儲user ID嗎? 據我所知,最終用戶可以修改cookie ...

您似乎對會話和cookie沒有清晰的願景!

除了您的代碼(攻擊旁邊),任何機構都無法更改會話內容。 因此,您可以存儲所有(合理的),例如您需要經常訪問的user idusername 在cookie中,您必須存儲一些模糊信息,以便您以后在用戶嘗試訪問您的頁面時識別該信息。 所以基於cookie內容你可以重新生成用戶會話(即自動重新登錄用戶)。 只是要注意用戶可以更改cookie內容,因此出於安全原因,它不能像user id那樣簡單。

我給你一個簡單的例子,它遠非完美但不是那么糟糕! 您可能需要定制它以適合您的場景:

在這里你可以像這樣創建cookie內容:

$salt = substr (md5($password), 0, 2);
$cookie = base64_encode ("$username:" . md5 ($password, $salt));
setcookie ('my-secret-cookie', $cookie);

然后重新登錄用戶你做:

$cookie = $_COOKIE['my-secret-cookie'];
$content = base64_decode ($cookie);
list($username, $hashed_password) = explode (':', $hash);

// here you need to fetch real password from database based on username. ($password)
if (md5($password, substr(md5($password), 0, 2)) == $hashed_password) {
    // you can consider use as logged in
    // do whatever you want :)
}

更新:

我寫這篇文章涵蓋了這個概念。 希望能幫助到你。

您應該將隨機會話值存儲在cookie中。 您絕對不應該在cookie本身中存儲有關用戶的任何信息。 然后,您可以檢查每個頁面加載時cookie中的會話ID,以確保(a)用戶應該有權訪問該內容,以及(b)會話ID有效。

在PHP中,您可以使用session_set_cookie_paramssession_name來設置cookie的參數。

對於誰可能更喜歡使用cookie(因此即使瀏覽器關閉也可以長時間訪問它),這是一種在cookie中存儲粗略ID的安全方法:

  1. 在用戶數據庫中創建一個新字段,命名為X.
  2. 生成cookie以保留用戶ID
  3. 生成一個安全的(比較長的) RandomString並將其保存在另一個cookie中。
  4. 同時將該隨機字符串保存在X字段中。
  5. 在成員區域中,檢查IDRandomString的 cookie 是否與數據庫信息匹配。
  6. 當用戶注銷並在下次登錄時為X生成數據時清除列X.

為防止庫攻擊與該隨機字符串匹配,您還可以在檢查失敗時立即強制注銷或在特定時間內阻止該IP。

用戶無法編輯會話變量,這些變量在服務器上進行管理。

會話變量優勢
1)安全
2.)魯棒

會話缺點1.)生命周期短,直到會話存在,

會話被破壞了
當用戶關閉瀏覽器服務器時重啟
會話使用session_destroy()銷毀;

因此會話更安全

另一方面,Cookie讓您記住用戶的偏好

如果您使用兩者的組合,那么它對您的代碼有利

You can store userid and username in cookie, then verify user identity using its combination.

如果它不退出,那么您可以登錄用戶並保持會話中的信息以及更新cookie。

暫無
暫無

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

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