当我调用session_start()
或时session_regenerate_id()
,PHP生成的会话ID似乎是一个随机字符串。我想知道的是,它只是字符的随机序列,还是像uniqid()
函数?
因为如果只是随机字符,理论上您难道不会遇到冲突吗?如果用户A登录,然后用户B登录,并且用户B生成相同的会话ID(尽管可能性很小),则用户B最终将访问用户A的帐户。
即使PHP检查是否已经存在具有相同ID的会话,并且如果存在,则再次重新生成ID ...我不希望我的系统即使在垃圾回收之后也不会两次产生相同的ID,也许我想存储它们的表并针对它们进行检查,以防可能的劫持或任何其他行为。
如果不是唯一的,我应该如何实施唯一性?我宁愿使用PHP配置而不是我编写的每个脚本来实现它。PHP会话的好处是不必担心幕后的技术细节。
如果您想了解PHP默认情况下如何生成会话ID,请查看Github上的源代码。它肯定不是随机的,并且基于这些成分的哈希值(默认值:md5)(请参见代码段的310行):
如果OS具有可用的随机源,则出于成为会话ID的目的,生成的ID的强度很高(/ dev / urandom和其他OS随机源(通常)是密码安全的PRNG)。如果不是这样,那就令人满意了。
会话标识生成的目标是:
这是通过PHP的会话生成方法来实现的。
您不能绝对保证唯一性,但是两次击中相同哈希的概率很低,通常来说,这是不值得担心的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句