我对 PHP 会话的理解正确吗?

Posted

技术标签:

【中文标题】我对 PHP 会话的理解正确吗?【英文标题】:Is my understanding of PHP sessions correct? 【发布时间】:2010-10-06 03:21:33 【问题描述】:

我一直对会话如何在内部工作很感兴趣,但我对 C 知之甚少(并且不确定在哪里可以查看 php 源代码)。

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

    当您启动会话时,用户会获得一个存储在 cookie 中的会话 ID。 保存会话数据时(通过$_SESSION),它会存储在文件系统中,并带有相关的会话 ID 和到期时间。

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

谢谢,

【问题讨论】:

【参考方案1】:

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

是这样的:

获取时间 获取远程IP地址 使用当前时间的秒数和微秒以及 IP 地址构建一个字符串 将其输入配置的session hash function(MD5 或 SHA1) 如果已配置,请从entropy file 提供一些额外的随机性 生成最终哈希值

所以复制是相当困难的。但是,您应该熟悉会话固定的概念,它允许攻击者可能选择他们的目标将采用的 session_id - 请参阅 Sessions and Cookies 以获得良好的入门。

【讨论】:

【参考方案2】:

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

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

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

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

【讨论】:

【参考方案3】:

会话 ID 可能只是一个随机的字母和数字字符串。如果 PHP 没有检查它是否是唯一的,因此对于两个用户来说不能相同,这也会很奇怪。至于(1)和(2),我说你是对的,但我最近没有使用 PHP,所以请不要相信我。

【讨论】:

以上是关于我对 PHP 会话的理解正确吗?的主要内容,如果未能解决你的问题,请参考以下文章

我对缓冲区的理解正确吗?

我对 MAKE 的理解正确吗?

我对A20线检查代码的理解是否正确?

PHP $_SERVER['HTTP_HOST'] vs. $_SERVER['SERVER_NAME'],我对手册页的理解正确吗?

ObjectA.Signal.connect(ObjectB.Slot) 不工作。我的理解正确吗?

php会话随机丢失,无法理解为啥