我对PHP会话的理解是否正确?

我一直对会话如何在内部工作感兴趣,但是我对C有一点了解(并且我不确定在哪里查看PHP源代码)。

这是我目前对会话的理解:

  1. 当你开始一个会话时,用户被分配一个存储在cookie中的会话ID。
  2. 当会话数据被保存时(通过$_SESSION ),它被存储在文件系统中,有相关的会话ID和到期时间。

它是否正确? 什么是创build会话ID的方法? 我假设它是基于时间的,但如果两个用户同时发送请求呢? 什么方法在内部,以防止他们获得相同的ID?

谢谢,

我的理解是内部会话处理过程如下:

session_start被调用时,PHP正在从客户端查找通过POST,GET或cookie发送的参数(取决于configuration;请参阅session.use_cookiessession.use_only_cookiessession.use_trans_sid ),名称为session.name的值使用已经启动的会话的会话ID。

如果发现有效的会话ID,它将尝试从存储中检索会话数据(请参阅session.save_handler )以将数据加载到$_SESSION 。 如果找不到ID或者其用法被禁止,则PHP会使用散列函数(请参阅session.hash_function )为生成随机数据的源数据生成一个新ID(请参阅session.entropy_file )。

在运行结束时或调用session_write_close时, $_SESSION的会话数据被存储到指定的存储中。

在php源文件中查看ext / session / session.c中的php_session_create_id

它是这样的:

  • 得到一天的时间
  • 获得远程IP地址
  • 从当前时间开始build立一个以秒和微秒为单位的string以及IP地址
  • 将其馈送到configuration的会话散列函数 (MD5或SHA1)
  • 如果已configuration,则从熵文件提供一些额外的随机性
  • 生成最终的哈希值

所以得到一个重复是非常困难的。 但是,您应该熟悉会话固定的概念,它允许攻击者可能select他们的目标将采用的session_id – 请参阅Sessions和Cookies以获取良好的入门知识。

会话ID可能只是一个字母和数字的随机string。 另外,如果PHP没有检查它是唯一的,并且因此对于两个用户不可能是相同的。 至于(1)和(2),我会说你是正确的,但我最近没有与PHP合作过,所以请随时不要相信我。