0

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

谢谢

4

2 回答 2

1

会话 ID 极不可能发生冲突。添加微时间应该使它安全。如果您想真正安全并保护自己不让字符串被猜到,您可以在代码中包含用户的 IP 地址以及硬编码的私钥,然后对整个内容进行快速 md5 哈希。使用哈希作为您的字符串。使用uniqid()可能会更好,但听起来你因为某种原因不能这样做。

于 2013-08-15T11:09:03.143 回答
0

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

该手册似乎只是简要介绍了这一点。虽然这不是一个硬性保证,但它确实在这里说明:

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

请注意,您可以通过将参数传递给session_id函数来指定您自己的会话 ID,因此您可以提出自己的会话 ID 并使用某种方法来确保它是唯一的。例如,您可以存储最近使用的会话 ID 池,或者使用计数器的一对一功能,您可以在每次创建新会话时手动递增该功能。

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

于 2013-08-15T12:21:13.167 回答