PHP会话ID有多独特

PHP会话ID有多独特? 我从各种事情中得到了印象,我不应该依赖两个用户永远不会获得相同的sessionid。 这不是一个GUID?

Session_id确实可以重复,但概率很低。 如果你有一个网站公平的交通,它可能会发生在你的网站生活,只会惹恼一个用户一个会话。

除非您希望为银行业build立一个高stream量的网站或服务,否则这不值得关注。

发货并不是很独特。 在默认的configuration中,它是包含gettimeofday(这不是非常独特的)结果的散列结果,但是如果你担心,你应该configuration它从/ dev / urandom中绘制一些熵,像这样

ini_set("session.entropy_file", "/dev/urandom"); ini_set("session.entropy_length", "512"); 

在他们正在使用的实际algorithm的代码中search“php_session_create_id”。

编辑补充说:有一个由pid播种的DFA随机数发生器,与usecs中的时间混合在一起。 从安全angular度来看,这不是一个确定的独特性条件。 使用上面的熵configuration。

更新:

从PHP 5.4.0开始session.entropy_file默认为/ dev / urandom或/ dev / arandom(如果可用)。 在PHP 5.3.0中,这个指令默认是空的。 PHP手册

如果您想自定义ID的生成方式(默认情况下是通过MD5生成的128位数字),您可以安装替代的哈希生成函数。 见http://www.php.net/manual/en/session.configuration.php#ini.session.hashfunction

有关PHP会话的更多信息,请尝试这篇出色的文章http://shiflett.org/articles/the-truth-about-sessions ,其中还链接到其他关于会话固定和劫持的文章。

如果你想知道PHP默认如何生成会话ID,请查看Github上的源代码。 这当然不是随机的,并且基于这些成分的散列(默认:md5)(参见代码片段的第310行):

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

如果操作系统有一个可用的随机源,那么为了成为一个会话ID而产生的ID的强度很高( / dev / urandom和其他操作系统随机源(通常)是密码安全的PRNG )。 如果不是,那么它是令人满意的。

会话标识生成的目标是:

  1. 最小化生成具有相同值的两个会话ID的概率
  2. 生成随机密钥并在使用中产生非常具有挑战性的计算能力

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

你不能绝对保证唯一性 ,但是一般来说,两次碰到相同的哈希值的概率是很低的,不值得担心。

session_id的大小
假设seesion_id是均匀分布的,并且大小= 128位。 假定地球上的每个人每天login一次,持续1000年的新的会话。

 num_sesion_ids = 1000*365.25 *7*10**9 < 2**36 collission_prob < 1 - (1-1/2**82)**(2**36) ≈ 1 - e**-(1/2**46) ≈ 1/2**46 

所以一次或多次碰撞的概率不到七万亿分之一。 因此,session_id的128位大小应该足够大。 正如其他评论中提到的那样,session_manager也可能会检查新的session_id是否已经存在。

随机性
因此,我认为最大的问题是session_id:是否具有良好的伪随机性。 在这一点上,你永远无法确定,但我build议使用一个众所周知的,经常使用的标准解决scheme(如你可能已经这样做)。

即使由于检查而避免了冲突,session_id的随机性和大小也是非常重要的,所以黑客无法以某种方式进行合格的猜测,并且find活动的session_id:s的概率很大。

我还没有find一个确认,但我相信PHP检查是否已经存在一个会话ID之前创build一个与该ID。

人们担心的会话劫持问题是有人发现活跃用户的会话ID。 这可以通过很多方式来防止,更多的信息可以在php.net和本文关于会话固定中看到

不,会话ID不是一个GUID,但两个用户不应该获得相同的会话ID,因为它们存储在服务器端。