session_regenerate_id()vs session_id(randomString)

时间:2016-05-21 21:02:32

标签: php session

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

  

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

     

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

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

如果是这样,复制文件有什么好处?如何从防止会话固定的角度来看更好?

This answer,或我发现的任何其他内容都没有回答我的问题。

3 个答案:

答案 0 :(得分:4)

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

在session_start 之后的

session_id($ id)

在session_start之后调用会话ID函数将更改会话ID。在页面加载结束时,当前会话内容将写入新的会话文件。这将保留旧的会话文件,并且不会更新任何更改。但是, session_id不会发送新会话Cookie 。这是由session_start完成的,即使在session_id之前调用session_start也是如此。在下一页加载时,传递旧会话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)传递参数。

答案 1 :(得分:0)

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

示例

条件:

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

说明

  • 您为当前用户启动了一个新会话,生成的会话ID为' 1234abc'会话保存处理程序将会话信息保存在/tmp/sess_1234abc
  • 用户现在将离开您的应用
  • 用户返回您的应用,会话保存处理程序检索会话ID' 1234abc'来自会话cookie;然后会话保存处理程序将加载会话数据文件(在这种情况下为/tmp/sess_SESSID} {/ 1}} {/ 1>
  • 现在您将会话ID更改为' myTestSession'使用/tmp/sess_1234abc函数
  • 此时用户会话cookie已更新
  • 用户离开您的应用
  • 用户回到您的应用程序,但会话保存处理程序无法检索会话数据,实际上它会查找session_id文件,但会话未被{{1更改函数仍然是/tmp/sess_MyTestSession

因此,如果您想阻止会话固定,那么绝对是session_id

答案 2 :(得分:0)

session_regenarate_id()的方式在内部包含session_id()

  

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

另一方面

  

session_regenarate_id()不仅仅是设置会话   标识符,但也从旧的sess_*文件中获取会话数据   并将其附加到新的(具有随机ID)并创建新的cookie。取决于   delete_old_session中的session_regenarate_id()参数(如果已设置)   到true它将删除旧的关联会话文件,否则它   将保留为文件,但它将清空所有会话数据。