php会话ID有多独特?我从各种各样的事情中得到了印象,我不应该依赖两个用户永远不会得到相同的sessionid.这不是GUID吗?
它出货时并不是很独特.在默认配置中,它是各种事物的散列的结果,包括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_id确实可以复制,但概率非常低.如果您的网站流量公平,可能会在您的网站生活中发生一次,并且只会让一个用户厌倦一个会话.
除非您希望为银行业建立一个非常高流量的网站或服务,否则不值得关注.
如果你想知道PHP默认情况下如何生成会话ID,请查看Github上的源代码.它当然不是随机的,并且基于这些成分的哈希值(默认值:md5)(参见代码片段的第310行):
客户端的IP地址
当前时间
PHP线性同余生成器 - 伪随机数生成器(PRNG)
特定于操作系统的随机源 - 如果操作系统有可用的随机源(例如/ dev/urandom)
如果OS具有可用的随机源,则为了作为会话ID而生成的ID的强度高(/ dev/urandom,并且其他OS随机源(通常)是加密安全的PRNG).但如果它没有那么它是令人满意的.
会话标识生成的目标是:
最小化生成具有相同值的两个会话ID的概率
使计算生成随机密钥并使用其中一个非常具有挑战性.
这是通过PHP的会话生成方法实现的.
你不能绝对保证唯一性,但是它的概率很低,只能达到相同的两倍,一般来说,不值得担心.
如果要自定义生成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,它还链接到有关会话固定和劫持的其他文章.
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.