我的理解中,PHP会话的使用方式是正确的吗?

17

我一直对会话(session)的内部工作方式感兴趣,但我对C语言知识很少(并且不确定在PHP源代码中应该查找什么)。

目前我对会话(session)的理解是:

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

这个理解正确吗?此外,会话ID是如何创建的呢?我猜测它基于时间,但如果两个用户同时发送请求会怎样?内部有哪些方法可以防止它们获得相同的ID?

谢谢!

3个回答

31

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

当调用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中的会话数据存储到指定的存储器中。


17
看看php源码中的ext/session/session.c中的php_session_create_id。
它的过程如下:
- 获取当前时间 - 获取远程IP地址 - 用当前时间的秒数和微秒数以及IP地址构建一个字符串 - 将该字符串输入到配置的session hash function(可以是MD5或SHA1) - 如果配置了,还可以从entropy file中获取一些额外的随机性 - 生成最终的哈希值
因此,要获得重复的哈希值是相当困难的。然而,你应该熟悉会话固定的概念,这允许攻击者潜在地选择他们的目标将采用的会话ID - 可以参考Sessions and Cookies了解更多信息。

1

会话 ID 可能只是一串随机的字母和数字。此外,如果 PHP 没有检查它是否唯一,因此不能相同于两个用户,那么这将是奇怪的。至于 (1) 和 (2),我认为你是正确的,但我最近没有使用 PHP,所以请随意不相信我。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接