PHP会话ID-如何生成?

米勒

当我调用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行):

  1. 客户端的IP地址
  2. 当前时间
  3. PHP线性同余生成器-伪随机数生成器(PRNG)
  4. 特定于操作系统的随机源-如果操作系统具有可用的随机源(例如/ dev / urandom)

如果OS具有可用的随机源,则出于成为会话ID的目的,生成的ID的强度很高(/ dev / urandom和其他OS随机源(通常)是密码安全的PRNG)。如果不是这样,那就令人满意了。

会话标识生成的目标是:

  1. 最小化生成具有相同值的两个会话ID的可能性
  2. 生成随机密钥并击中使用中的密钥使计算变得非常困难

这是通过PHP的会话生成方法来实现的。

您不能绝对保证唯一性,但是两次击中相同哈希的概率很低,通常来说,这是不值得担心的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章