我对 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_cookies、session.use_only_cookies 和 session.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 会话的理解正确吗?的主要内容,如果未能解决你的问题,请参考以下文章
PHP $_SERVER['HTTP_HOST'] vs. $_SERVER['SERVER_NAME'],我对手册页的理解正确吗?