唯一是 php 会话 id?我有这样一个印象︰ 从我了解到我应该不依赖两个用户得不到相同的会话 id 的各种内容。它不是一个 GUID?

2008-09-26 10:41:50
问题评论:

回答:

Session_id 确实可以进行复制,但概率是非常低。如果有公平的流量的网站,它可以发生在 web 站点生命周期,并将只是骚扰一个用户一个会话后。

这并不值得保留,除非您希望生成非常高流量网站或服务的银行业界关注。

我已经听说过的网站,有很多的情况下,冲突的报告。

将近 4 年前已要求问题。一定会非常有趣,要知道是否从那时起有随意性的会话 id 算法...

@ColinM︰ 这些网站有 1 百万和唯一访问者 / 天。

Aparantly及其当前基于 (MD5/SHA1 哈希) 对用户的远程地址、 本地时间和一些随机数 (LCG).

我不需要中断移动,移动不断中断本身。:)

不是非常独特的产品附带的。在默认配置中它是的各种事项,包括 gettimeofday (它不是唯一的),结果哈希值的结果,但如果你担心,您应该将其配置为从 /dev/urandom,抽取一些熵如下所示

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

搜索"php_session_create_id"在代码中为他们正在使用的实际算法。

编辑要添加︰ 没有生成器通过 pid,usecs 中的时间与混合的 DFA 随机数字生成器。它不是坚定的唯一性条件特别是从安全的角度看使用上面的熵配置。

更新︰

从 PHP 含有 5.4.0 session.entropy_file/开发/urandom 或 arandom/开发/如果有默认值。在 PHP 5.3.0 此指令为空,默认情况。PHP 手册

是的当我不得不对敌人 combatants ultrasecure 和此类网站的合同,我实际上创建自定义会话处理程序并直接从 random.org 送入其熵数据。但该系统的要求已远远超出什么无论是最无名小卒处理带有;-)

我认为一个熵的长度是 512(the max) 不是必需的。PHP 的配置有一个选项为 16。默认值实际上是 0。16 是我建议的任何应用程序,但不包括高度敏感的信息的最大长度

@thomas-jensen,gettimeofday unix 时间戳,但它以微秒 (有时)。读上面的链接的 php_session_create_id 方法。

更改熵长度提高了随机性,但不显著影响冲突的可能性由于哈希值仍然是具有相同的长度。但是,更改 session.hash_function,您可以使用像 sha512 较长的哈希值,例如。

我发现很特殊,会有冲突。当然 PHP 应检查是否有该 id 下有效的会话并随后生成不同的 id。。

如果您想要定制生成 ID 的方式,您可以安装备用希代函数 (它是默认情况下通过 MD5 生成的 128 位数字)。请参见http://www.php.net/manual/en/session.configuration.php#ini.session.hash-function

PHP 会话的详细信息,请尝试还链接到其他文章有关会话 fixation 本优秀文章http://shiflett.org/articles/the-truth-about-sessions和劫持。

若要精确,将设置"session.hash_function = sha512"PHP 5.3 版和转到 512 位哈希。这都可以达到目的。使用默认值,很普遍在高流量站点以获取冲突上。

Session_id 的大小
假定该 seesion_id 均匀分布且具有大小 = 128 位。假设,在地球上的每个人在一天一次使用记录持续 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 

因此一个或多个发生冲突的可能性是小于在 70 一千数十亿美元。因此 session_id 的 128 位大小应该足够大。其他评论中所述,可能还不存在的新的 session_id 检查 session_manager。

随机性
因此我认为,最要紧的问题是是否具有良好的伪随机性生成 session_id:s。它永远不能确定,但我会推荐使用广为人知,并经常为此目的使用标准的解决方案 (如您可能已经执行)。

即使因检查而避免了冲突,随机性和 session_id 的大小是非常重要,以使黑客可以不,以某种方式不要限定猜测并查找活动 session_id:s 大概率。

我没有数学知识的人,但我认为要忘记生日问题,因此,虽然仍有小冲突的可能性远高于您提出建议。此外,djsadinoff 建议,作为 PHP 的不一定是使用默认情况下生成随机数字的一个好方法。

没有实际评估是正确的。上面的计算是一个简化的估计,我们估计的概率 i,是冲突的 session_id nr = 1/282 (它应该是 1/292 以上但 = 打字错误)。事实上,probablility 是 (i-1) / 2128 一样长的时间没有以前的冲突发生。 1/292 只保存最后一个 session_id。

如果您想要知道 PHP 如何按默认签出源代码在Github上产生一个会话 ID。它并不是随机和基于哈希值 (默认值︰ md5) (请参见代码段线路 310) 这些成分的︰

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

如果操作系统具有可用的随机源则为了在会话 ID 生成 ID 的最大优点是高 (/dev/urandom 和其他操作系统随机源 (通常) 是加密安全 Prng)。然后如果但是不令人满意。

会话标识生成与目标是︰

  1. 尽量减少生成两个会话 Id 具有相同值的概率
  2. 使其极具挑战性,需要消耗大量计算来生成随机密钥并命中一个使用.

这被通过 PHP 的会话生成方法。

绝对不能保证唯一性,但概率是这么低的击球相同哈希值两倍的是,通常情况下,不值得担心。

内容来源于Stack Overflow How unique is the php session id
请输入您的翻译

How unique is the php session id

确认取消