当前位置:  开发笔记 > 编程语言 > 正文

php会话ID有多独特

如何解决《php会话ID有多独特》经验,为你挑选了5个好方法。

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



1> djsadinoff..:

它出货时并不是很独特.在默认配置中,它是各种事物的散列的结果,包括gettimeofday的结果(这不是非常独特),但是如果你担心,你应该将它配置为从/ dev/urandom中绘制一些熵,就像这样

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

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

编辑添加:有一个由pid播种的DFA随机数生成器,与usecs中的时间混合.从安全角度来看,这不是一个坚定的唯一性条件.使用上面的熵配置.

更新:

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


改变熵长度可以改善随机性,但不会显着影响碰撞的可能性,因为散列的长度仍然相同.但是,更改session.hash_function允许您使用更长的哈希值,例如sha512.
我发现有碰撞是奇怪的.当然应该使用PHP来检查该id下是否存在有效会话,然后生成不同的ID.

2> e-satis..:

Session_id确实可以复制,但概率非常低.如果您的网站流量公平,可能会在您的网站生活中发生一次,并且只会让一个用户厌倦一个会话.

除非您希望为银行业建立一个非常高流量的网站或服务,否则不值得关注.


这个问题已在近4年前提出过.知道会话id算法从那时起是否已经即兴创作将会很有趣......
我听说过有很多碰撞案例的网站报道.
我不需要打破移动,移动不断打破自己.:)

3> GordyD..:

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

    客户端的IP地址

    当前时间

    PHP线性同余生成器 - 伪随机数生成器(PRNG)

    特定于操作系统的随机源 - 如果操作系统有可用的随机源(例如/ dev/urandom)

如果OS具有可用的随机源,则为了作为会话ID而生成的ID的强度高(/ dev/urandom,并且其他OS随机源(通常)是加密安全的PRNG).但如果它没有那么它是令人满意的.

会话标识生成的目标是:

    最小化生成具有相同值的两个会话ID的概率

    使计算生成随机密钥并使用其中一个非常具有挑战性.

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

你不能绝对保证唯一性,但是它的概率很低,只能达到相同的两倍,一般来说,不值得担心.



4> Paul Dixon..:

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

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


确切地说,为PHP 5.3设置"session.hash_function = sha512",然后设置为512bit哈希.这应该可以解决问题.使用默认值,在高流量站点上常见的是发生冲突.

5> MrJ..:

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 

因此,一次或多次碰撞的概率小于7万亿中的一个.因此,128位大小的session_id应该足够大.如其他注释中所述,session_manager也可能检查新的session_id是否已存在.

随机性
因此,我认为最大的问题是session_id:s是否生成具有良好的伪随机性.在那你永远不能确定,但​​我建议使用一个众所周知的,经常使用的标准解决方案为此目的(你可能已经做过).

即使由于检查而避免冲突,session_id的随机性和大小也很重要,因此黑客不能以某种方式进行合格的猜测并找到具有大概率的活动session_id:s.


我不是数学家,但我认为你忘了[生日问题](http://en.wikipedia.org/wiki/Birthday_problem)所以碰撞的机会虽然很小但比你建议的要大得多.另外,正如djsadinoff所建议的那样,PHP并不一定使用默认生成随机数的好方法.
推荐阅读
mobiledu2402852413
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有