PHP会话ID唯一性(用于cookie)

时间:2011-04-04 17:44:35

标签: php mysql session

我正在编写一个用户系统,用户将使用Twitter的API登录,然后我将信息存储在一个数据库中,还有一些我用户输入的额外部分。我希望用户能够登录后返回,无需再次登录。我决定获取有关用户的所有相关信息,将其保存到数据库,然后将会话ID和用户ID保存到另一个表中。最后,我在用户的计算机上设置了一个包含相同会话ID的cookie,以便在整个浏览过程中保持登录状态。然后,如果他们关闭浏览器并稍后重新访问该网站,我会读取该cookie,进行比较使用sessions表,获取用户ID,并重新构建会话(使用新会话ID更新会话表)。

我的问题是,会话ID的随机性如何?是否有可能用户可能获得与一周内未访问该网站的用户相同的会话ID(因此cookie仍然处于活动状态)已分配给他们?如果发生这种情况,则服务器可能会将新用户误认为是旧用户。我真的想避免使用IP地址,因为人们可能会在移动浏览器中访问该网站,IP可以随时更改。

有关于此的任何想法吗?我只想确保用户A和用户B在任何时间内分开,不会获得相同的会话ID。

3 个答案:

答案 0 :(得分:4)

虽然同时具有两个具有相同标识符的活动会话的概率非常低(取决于hash function),但您可以向该会话ID添加额外的(伪)唯一值以获得具有两种特征的价值。

您可以使用符合后者的uniqid

uniqid(session_id(), true)

uniqid的值基于microtime,其中包含来自lcg_value的附加伪随机数,以及更多熵的额外来源,它们共同保证唯一值。

答案 1 :(得分:2)

以微秒为单位将当前时间追加到唯一ID ...

session_id() + microtime();

因此,session_ids不仅必须是相同的,它必须在相同的微秒内发生......使得几乎不可能完全消失。保证100%的唯一方法是针对所有现有会话ID检查此随机值,并在已存在的情况下重新滚动它。

答案 2 :(得分:1)

PHP会话ID是一个MD5哈希值,它的长度为128位。这就是340,000,000,000,000,000,000,000,000,000,000,000,000,000种不同的可能性。两个人获得同一个人的几率相当遥远。

如果您想保证唯一性,请根据序号在Cookie中添加内容。