我对PHP会话的理解是否正确?
我一直对会话如何在内部工作感兴趣,但是我对C有一点了解(并且我不确定在哪里查看PHP源代码)。
这是我目前对会话的理解:
- 当你开始一个会话时,用户被分配一个存储在cookie中的会话ID。
- 当会话数据被保存时(通过
$_SESSION
),它被存储在文件系统中,有相关的会话ID和到期时间。
它是否正确? 什么是创build会话ID的方法? 我假设它是基于时间的,但如果两个用户同时发送请求呢? 什么方法在内部,以防止他们获得相同的ID?
谢谢,
我的理解是内部会话处理过程如下:
当session_start
被调用时,PHP正在从客户端查找通过POST,GET或cookie发送的参数(取决于configuration;请参阅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地址
- 从当前时间开始build立一个以秒和微秒为单位的string以及IP地址
- 将其馈送到configuration的会话散列函数 (MD5或SHA1)
- 如果已configuration,则从熵文件提供一些额外的随机性
- 生成最终的哈希值
所以得到一个重复是非常困难的。 但是,您应该熟悉会话固定的概念,它允许攻击者可能select他们的目标将采用的session_id – 请参阅Sessions和Cookies以获取良好的入门知识。
会话ID可能只是一个字母和数字的随机string。 另外,如果PHP没有检查它是唯一的,并且因此对于两个用户不可能是相同的。 至于(1)和(2),我会说你是正确的,但我最近没有与PHP合作过,所以请随时不要相信我。