我使用会话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不会被重用,但这与您的问题并不严格相关。