覆盖PHP会话ID

时间:2014-05-18 11:44:12

标签: php session

我正在创建自己的SessionHandler类,实现SessionHandlerInterface

根据the manual,我必须实施5种方法:close()destroy($session_id)gc($maxlifetime)open($save_path, $session_id)read($session_id)和{{1 }}

本手册甚至提供了一个示例实现,而且非常简单。我唯一的问题是PHP会话ID总是以下形式:

  

hpuhqm4ppmdfaat5s1qmt5s397

但我希望将其更改为更加标准化uuidv5

由于$ session_id是传递给所有方法的参数,因此我能想到的唯一方法是在write($session_id, $session_data)方法实现上使用session_id($uuidv5)覆盖已生成的会话ID,并且这看起来不对。

有更清洁的方法吗?

1 个答案:

答案 0 :(得分:2)

  

有更清洁的方法吗?

更改基础PHP会话ID创建功能。它使用哈希值,默认情况下是可配置的(在session.hash_function PHP ini directivesession.save_handler阅读更多内容),但如果现有配置选项与 uuidv5 需求不匹配,则需要添加它是PHP的核心代码或通过PHP扩展。


有关您在评论中呻吟的更多信息,编写PHP扩展程序会“过度”:

userland PHP会话保存处理程序接口不包含核心会话保存处理程序s_create_sid方法,这实际上是您正在寻找的方法。这使得用户空间变得困难,因为该功能并非打算在用户空间中完成。

由于会话ID创建受安全性的影响,并且PHP核心开发人员过去已经了解到这里很容易出错,因此他们甚至更少信任其他人。那些使用该语言的人,可以在这里轻松更改会话ID生成(我猜测,否则该函数可能已导出到userland会话保存处理程序)。

但是,您可以创建自己的UUID,以便使用会话ID,然后只需哈希以配置的方式作为会话ID。

然后,您可以将UUID表单的非散列值保存为会话变量。

如果你真的需要在前端使用UUID,那么我倾向于说(如果甚至可以在SO回答中说出来)你所做的是多么可疑,我会仔细检查你的动机。因为技术上只需要某些 ID,所以不应该有格式要求,因此我认为没有任何理由不重复使用现有的会话ID。