php在同一时刻不同会话的会话id是否相同


can session id be the same for different sessions at the same moment of time php

我使用会话id和microtime()来生成唯一的字符串(我知道uuid,但需要这样做):这里可能有重复项吗?主要是,是否有可能在同一时刻匹配2个或多个会话ID(以微秒为单位计算)?考虑到网站一天的流量只有几百万(当然,如果这很重要的话)。

感谢

会话ID极不可能发生冲突。增加微时间应该是安全的。如果你想真正安全,并保护自己免受字符串的猜测,你可以在代码中包括用户的IP地址和硬编码私钥,然后对整个过程进行快速的md5哈希。使用哈希作为字符串。使用uniqid()可能会更好,但由于某些原因,听起来您无法做到这一点。

如果会话ID同时重复,则意味着两个(或多个)访问者正在共享一个会话。请记住,会话ID是PHP决定加载哪个会话的唯一方法,因此重复的ID会破坏会话的目的,这是一个巨大的安全问题。我并不是说这是不可能的,你需要确切地知道PHP是如何生成会话ID的。但这很可能是极不可能的。

手册似乎只是简单地提到了这一点。虽然这并不完全是一个硬性保证,但它确实在这里声明:

访问您网站的访问者会被分配一个唯一id,即所谓的会话id

请注意,您可以通过向session_id函数传递参数来指定自己的会话ID,这样您就可以获得自己的会话标识,并使用某种方法来确保它是唯一的。例如,您可以存储最近使用的会话ID池,或者使用计数器的一对一函数,每次创建新会话时都可以手动递增该函数。

最后,我认为microtime()不能保证精确到一微秒,这意味着它实际上可能不会每微秒改变一次。为了安全起见,我假设它每秒只更改一次,然后确保在一秒钟内没有会话ID被重用。使用上面描述的任何一种方法,这都相当容易。如果您保留了一个最近会话ID的池,只需确保它们不会在上次使用后一秒钟内从池中删除。如果你使用的是计数器,只要确保它不会在一秒钟内重置或翻转。当然,在这两种情况下,如果另一个会话仍在使用会话ID,您还需要确保该会话ID不会被重用,但这与您的问题并不严格相关。