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

Ros*_*oss 17 php session

我一直对会话如何在内部工作感兴趣,但我对C知之甚少(并且不确定在PHP源代码中查找的位置).

这就是我对会议的理解:

  1. 当您启动会话时,将为用户分配一个存储在cookie中的会话ID.
  2. 当会话数据被保存(通过$_SESSION)时,它存储在文件系统上,具有相关的会话ID和到期时间.

它是否正确?还有什么方法可以创建会话ID?我假设它是基于时间的,但如果两个用户同时发送请求怎么办?内部有哪些方法可以防止它们获得相同的ID?

谢谢,

Gum*_*mbo 31

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

session_start被调用时,PHP正在寻找来自客户端的参数通过了POST,GET发送,或在Cookie(取决于配置;请参阅session.use_cookies,session.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被存储到指定的存储中.


Pau*_*xon 17

查看php源代码中ext/session/session.c中的php_session_create_id

它是这样的:

  • 得到时间
  • 获取远程IP地址
  • 使用当前时间的秒和微秒以及IP地址构建一个字符串
  • 将其提供给配置的会话哈希函数(MD5或SHA1)
  • 如果已配置,则从熵文件中提供一些额外的随机性
  • 生成最终哈希值

因此获得重复是非常困难的.但是,您应该熟悉会话固定的概念,这允许攻击者可能选择他们的目标将采用的session_id - 请参阅会话和Cookie以获得良好的入门.