我使用session id和microtime()来生成唯一的字符串(我知道uuid,但需要这样做):是否可以在这里有重复项?主要是,有两个或更多会话id可能在同一时刻匹配 - 以微秒为单位计算?考虑到网站的流量在白天是几百万(如果它当然重要)。
由于
答案 0 :(得分:1)
会话ID极不可能发生冲突。添加microtime应该使它安全。如果你想要非常安全并且保护自己免受字符串的猜测,你可以在你的代码中包含用户的IP地址和硬编码的私钥,然后对整个事情做一个快速的md5哈希。使用哈希作为您的字符串。使用uniqid()
可能会更好,但听起来你出于某些原因无法做到这一点。
答案 1 :(得分:0)
如果会话ID同时重复,则意味着两个(或更多)访问者正在共享会话。请记住,会话ID是PHP必须决定加载哪个会话的唯一方法,因此具有重复的ID会破坏会话的目的和是一个巨大的安全问题。我不是说这是不可能的,你需要知道PHP如何生成会话ID才能知道。但这很可能非常不可能。
手册似乎只是简单地触及了这一点。虽然这不是一个很难保证,但它确实陈述here:
访问您网站的访问者被分配了唯一ID ,即所谓的会话ID
请注意,您可以通过将参数传递给session_id
函数来指定自己的会话ID,这样您就可以提出自己的会话ID并使用某种方法来确保它是唯一的。例如,您可以存储最近使用的会话ID池,或者使用计数器的一对一功能,您可以在每次创建新会话时手动增加该功能。
作为最后一点,我不认为microtime()
可以保证精确到1微秒,这意味着它实际上可能不会每微秒发生变化。为了安全起见,我假设它每秒只更改一次,然后确保在一秒钟内没有重用会话ID。使用上述任何一种方法,这都相当容易。如果您要保留最近会话ID的池,请确保它们在上次使用后不会超过一秒钟从池中删除。如果你正在使用柜台,
只需确保它不会在一秒钟内重置或翻转。当然,在任何一种情况下,您还要确保如果另一个会话仍在使用会话ID,则不会重复使用会话ID,但这与您的问题并不严格相关。