簡體   English   中英

PHP會話ID的唯一性(用於cookie)

[英]PHP Session ID uniqueness (for use in a cookie)

我正在編寫一個用戶系統,其中用戶將使用Twitter的API登錄,然后將信息以及用戶輸入的一些其他信息存儲在數據庫中。我希望用戶能夠回來登錄后,無需再次登錄。 我決定要獲取有關用戶的所有相關信息,將其保存到數據庫中,然后將會話ID和用戶ID保存到另一個表中。 最后,我將在用戶計算機上設置一個包含相同會話ID的cookie,以便他們在整個瀏覽過程中保持登錄狀態。然后,如果他們關閉瀏覽器並稍后重新訪問該網站,我將讀取該cookie,並進行比較使用會話表,獲取用戶ID,然后重建會話(使用新的會話ID更新會話表)。

我的問題是,會話ID有多隨機? 用戶是否有可能獲得與一周內沒有訪問過該站點(因此cookie仍處於活動狀態)的用戶相同的會話ID? 如果發生這種情況,則服務器可能會將新用戶誤認為舊用戶。 我真的想避免使用IP地址,因為人們可能會通過移動瀏覽器訪問該網站,而該IP在任何時候都可以更改。

有什么想法嗎? 我只想確保用戶A和用戶B隔開任何時間都不會獲得相同的會話ID。

盡管同時擁有兩個具有相同標識符的活動會話的可能性正在逐漸降低(取決於哈希函數 ),但是您可以向該會話ID添加一個額外的(偽)唯一值,以獲得同時具有兩個特征的值。

您可以使用滿足后者的uniqid

uniqid(session_id(), true)

uniqid的值是基於microtime與來自另外的偽隨機數字lcg_value和以上熵所有一起保證唯一值的額外來源。

將當前時間(以微秒為單位)附加到唯一ID ...

session_id() + microtime();

因此,不僅session_id必須相同,而且還必須在同一微秒內發生...使得消失的可能性幾乎是不可能的。 保證100%唯一的方法是對照所有現有的會話ID來檢查此隨機值,然后重新滾動它(如果已存在)。

PHP會話ID是MD5哈希,它的長度為128位。 大概有340,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000種不同的可能性。 兩個人得到同一個的幾率很小。

如果要保證唯一性,請根據序號將某些內容放入其cookie中。

暫無
暫無

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

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