Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 同一时刻不同会话的会话id是否相同_Php_Session - Fatal编程技术网

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

Php 同一时刻不同会话的会话id是否相同,php,session,Php,Session,我使用session id和microtime()生成唯一的字符串(我知道uuid,但需要这样做):这里可能有重复的吗?主要是,是否有可能在同一时间点(以微秒计算)匹配2个或更多会话ID?考虑到该网站的流量在一天中只有几百万(如果这当然重要的话) 谢谢会话ID极不可能发生冲突。添加微时间应该会让它更安全。如果您想要真正安全,并且保护自己不让字符串被猜测,那么您可以在代码中包含用户的IP地址以及硬编码的私钥,然后对整个过程进行快速md5哈希。使用散列作为字符串。使用uniqid()可能会更好,但是

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


谢谢

会话ID极不可能发生冲突。添加微时间应该会让它更安全。如果您想要真正安全,并且保护自己不让字符串被猜测,那么您可以在代码中包含用户的IP地址以及硬编码的私钥,然后对整个过程进行快速md5哈希。使用散列作为字符串。使用
uniqid()
可能会更好,但是,听上去由于某种原因,您无法做到这一点。

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

这本手册似乎只简要地提到了这一点。虽然这不是一个严格的保证,但它确实说明:

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

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

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

所以您只是将两者连接在一起?我认为您是安全的,请参见另一个问题:如果您有足够的计算机电源,冲突是极其罕见的,但并非不可能的,如此多的内核并行处理请求。如果您需要随机性,请询问随机性的来源,而不是时钟。@囚犯,不只是精确连接,而是smth。谢谢您也不应该依赖用户的IP地址,因为多个会话可能来自同一IP地址,而且这实际上比您想象的更常见。同一局域网上的任何用户都很可能拥有相同的面向公众的IP地址,使用代理的用户也会拥有相同的IP地址。感谢您的回复,我想我同意@sh1ftst0rm关于IP的想法。关于创建散列,我认为这不是一个好主意,因为它增加了冲突的可能性,请参阅我的另一个问题,为了避免使用sha512或“更多”散列是必要的,但不幸的是,它们给了我很长的字符串@sh1ftst0rm,我没有说放弃其他数据,只是添加更多。我知道用户经常共享IP地址,他们可以欺骗和捣乱IP地址,我自己也处理过,但你现在已经将冲突风险从全球人口降低到了一手共享IP的用户,这意味着其他标准中的冲突现在变得更加微不足道。来自全世界两个人的同一个微时间,当你有数百万的浏览量时,好吧。两个人共享一个IP地址的时间相同,可能性明显降低。它仍然不完美,但有了巨大的改进。@Davo,散列是如何增加碰撞的可能性的?在这种长度的字符串中,碰撞几乎是不可能的。查找实际搜索碰撞的人员的示例。很难找到碰撞,它们并不是随意出现的:)拉伸散列(通过几十次或数百次重新灰化)并不能减少碰撞。这使得通过rainbow表反转哈希变得更加困难。使用更长的散列字符串显然会减少冲突,但是,首先不会发生任何冲突。另外,我应该提到md5本身是不安全的。如果您需要它也是不可用的,那么构建您的密钥,然后使用phpass之类的工具来适当地拉伸和盐析您的哈希,并且使用比md5更好的算法。md5速度很快,但它的速度实际上使它不那么安全。你并没有说它是否需要安全。只是要小心,任何人都看不到这些会话ID,或者无法逆转你对它们所做的任何哈希。使用从您的实时用户获取的会话ID会导致会话劫持。如果他们来自已经结束的会话,那么应该没问题。这是一个非常好的观点。如果要生成作为计数器功能的ID,则需要非常小心,以确保计数器值本身不可发现,否则有人可能很容易找到将要使用的下两个会话ID。