我一直对会话如何在内部工作感兴趣,但我对C知之甚少(并且不确定在PHP源代码中查找的位置).
这就是我对会议的理解:
当您启动会话时,将为用户分配一个存储在cookie中的会话ID.
当会话数据被保存(通过$_SESSION
)时,它存储在文件系统上,具有相关的会话ID和到期时间.
它是否正确?还有什么方法可以创建会话ID?我假设它是基于时间的,但如果两个用户同时发送请求怎么办?内部有哪些方法可以防止它们获得相同的ID?
谢谢,
我的理解是内部会话处理过程如下:
当session_start
被调用时,PHP正在寻找来自客户端的参数通过了POST,GET发送,或在Cookie(取决于配置;请参阅session.use_cookies,session.use_only_cookies和session.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地址
使用当前时间的秒和微秒以及IP地址构建一个字符串
将其提供给配置的会话哈希函数(MD5或SHA1)
如果已配置,则从熵文件中提供一些额外的随机性
生成最终哈希值
因此获得重复是非常困难的.但是,您应该熟悉会话固定的概念,这允许攻击者可能选择他们的目标将采用的session_id - 请参阅会话和Cookie以获得良好的入门.