session_id($randomString)
和session_regenerate_id()
之间有什么明显的区别?两者似乎都改变了会话ID:
session_regenerate_id()会将当前会话ID替换为新会话ID,并保留当前会话信息。
session_id()用于获取或设置当前会话的会话ID。
如果我做对了,session_regenerate_id()
会创建一个新的会话文件并复制数据,并带有删除旧文件的选项;而session_id($randomString)
只是更改现有文件中的会话ID。
如果是这样,复制文件有什么好处?如何从防止会话固定的角度来看更好?
This answer,或我发现的任何其他内容都没有回答我的问题。
答案 0 :(得分:4)
好的,所以我做了一些测试,以找出三个不同选项(session_id($id)
,session_start()
和session_regenerate_id()
之后session_regenerate_id(true)
)的差异。这是实际发生的结果:
在session_start之后调用会话ID函数将更改会话ID。在页面加载结束时,当前会话内容将写入新的会话文件。这将保留旧的会话文件,并且不会更新任何更改。但是, session_id
不会发送新会话Cookie 。这是由session_start
完成的,即使在session_id
之前调用session_start
也是如此。在下一页加载时,传递旧会话ID并使用与最后一页加载开始时相同的数据加载(新会话更改将保存到新ID)。
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
函数之前调用,否则它可能会让你失去会话。
示例强>:
条件:
说明
/tmp/sess_1234abc
。/tmp/sess_SESSID
} {/ 1}} {/ 1>
/tmp/sess_1234abc
函数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
它将删除旧的关联会话文件,否则它 将保留为文件,但它将清空所有会话数据。