【问题标题】:session_regenerate_id() vs session_id(randomString)session_regenerate_id() 与 session_id(randomString)
【发布时间】:2016-05-21 21:02:32
【问题描述】:

session_id($randomString)session_regenerate_id() 之间的明显区别是什么?两者似乎都更改了会话 ID:

session_regenerate_id() 会将当前会话 id 替换为新的,并保留当前会话信息。

session_id()用于获取或设置当前会话的会话ID。

如果我做对了,session_regenerate_id() 会创建一个新的会话文件并复制数据,并带有删除旧文件的选项;而session_id($randomString) 只是更改现有文件中的会话ID。

如果是这样,复制文件有什么好处?如何更好地防止会话固定的观点?

This answer 以及我找到的任何其他人都没有回答我的问题。

【问题讨论】:

  • 如果您阅读了两个相应的手册页,会有明显的差异(尽管有点微妙),但我目前无法为此写出完整的答案,有 两个功能之间有一些重叠,但在行为上也有明显差异。
  • 这些 php 方法在幕后所做的细节并不是我在任何地方发现的记录,这对我来说很奇怪,因为我觉得这对于安全可靠很重要会话实施...感谢您提出这个问题。

标签: php session


【解决方案1】:

好的,所以我做了一些测试来找出三个不同选项的差异(session_start()session_regenerate_id()session_regenerate_id(true) 之后的session_id($id))。这是实际发生的结果:


session_start 之后的 session_id($id)

在 session_start 之后调用 session id 函数会改变 session id。在页面加载结束时,当前会话内容将写入一个新的会话文件。这也将保留旧的会话文件,并且不会随任何更改而更新。但是,session_id 不会发送新的会话 cookie。这是由session_start 完成的,即使在session_start 之前调用session_id。在下一次页面加载时,旧会话 id 被传递并加载与上次页面加载开始时相同的数据(新会话更改将保存到新 id)。


session_regenerate_id() 和 session_regenerate_id(true)

session_regenerate_id() 将创建和更改会话 ID,将会话转移到新文件并发送 cookie。将true 作为参数传递也会删除旧的会话文件,省略参数将保留它。


就会话固定而言,session_id($id)session_regenerate_id() 实际上会更糟,因为您正在创建新会话,同时保留旧会话文件被劫持。唯一可能有助于固定的选项是调用 session_regenerate_id(true) 传递参数。

【讨论】:

  • 完美答案,谢谢!值得一提的是,无论如何,在session_id()session_regenerate_id([true]) 之后,都应该调用session_start() 来接管新的标识符。
  • @Nordenheim,实际上, session_regenerate_id 应该在会话开始后调用。它更改当前会话的会话 ID 并发送一个新的 cookie。所以不需要在它之后调用 session_start 。通过 session_id 改变会话,你应该调用 session_start 或者你只是创建一个新的会话文件并且客户端永远不会被告知新生成的会话 id。
【解决方案2】:

session_id 函数只会更改会话 ID 并更新客户端上的会话 cookie。 session_regenerate_id 函数将像 session_id 一样在服务器上进行额外的会话迁移。 事实上,您可以从 session_id 函数的文档中看到,它需要在 session_start 函数之前调用,否则可能会导致会话丢失。

示例

条件:

  • 您正在使用基于文件的会话(php 默认)

说明:

  • 您为当前用户启动一个新会话,生成的会话 id 为“1234abc”,会话保存处理程序将会话信息保存在/tmp/sess_1234abc
  • 用户现在将离开您的应用
  • 用户返回您的应用程序,会话保存处理程序从会话 cookie 中检索会话 ID“1234abc”;然后会话保存处理程序将加载会话数据文件(/tmp/sess_SESSID 在本例中为/tmp/sess_1234abc
  • 现在您使用 session_id 函数将会话 ID 更改为“myTestSession”
  • 此时用户会话 cookie 得到更新
  • 用户离开您的应用
  • 用户回到您的应用程序,但会话保存处理程序无法检索会话数据,实际上它会查找 /tmp/sess_MyTestSession 文件但会话尚未被 session_id 函数更改所以仍然/tmp/sess_1234abc!

所以如果你想防止会话固定,那么绝对是session_regenerate_id

【讨论】:

    【解决方案3】:

    在某种程度上session_regenarate_id() 内部包含session_id()

    session_id() 是一种获取或设置会话标识符的方法。它 不处理会话sess_* 文件。你把它放在前面 session_start 以指示会话标识符。曲奇饼 创建和会话文件创建是session_start 稍后工作。

    另一方面

    session_regenarate_id() 不是简单地设置会话 标识符,还可以从旧的sess_* 文件中获取会话数据 并将其附加到新的(带有随机 id)并创建一个新的cookie。根据 session_regenarate_id() 中的 delete_old_session 参数(如果已设置) 到true 它将删除旧的关联会话文件,否则它 将保留为文件,但所有会话数据都为空。

    【讨论】:

    • 我在任何地方都找不到关于session_regenerate_id 内部工作的第二点……感谢您的描述。
    猜你喜欢
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 2015-10-14
    • 2012-12-20
    • 2011-05-29
    • 1970-01-01
    相关资源
    最近更新 更多