我对 PHP 会话的理解是否正确?

2022-08-30 22:47:49

我一直对会话在内部的工作方式感兴趣,但我对C知之甚少(并且不确定在PHP源代码中哪里可以找到它)。

以下是我目前对会议的理解:

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

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

谢谢


答案 1

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

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

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

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


答案 2

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

它是这样的:

  • 获取一天中的时间
  • 获取远程 IP 地址
  • 使用当前时间的秒和微秒以及 IP 地址构建一个字符串
  • 将其馈送到配置的会话哈希函数(MD5 或 SHA1)中
  • 如果已配置,请从熵文件中提供一些额外的随机性
  • 生成最终哈希值

因此,获得副本非常困难。但是,您应该熟悉会话固定的概念,它允许攻击者潜在地选择其目标将采用session_id - 请参阅会话和Cookie以获取良好的入门。


推荐