覆盖 PHP 会话 ID

3
我正在创建自己的`SessionHandler`类,实现`SessionHandlerInterface`。根据手册,我必须实现5个方法:`close()`、`destroy($session_id)`、`gc($maxlifetime)`、`open($save_path, $session_id)`、`read($session_id)`和`write($session_id, $session_data)`。手册甚至提供了一个示例实现,非常直接。唯一的问题是PHP会话ID始终采用以下格式:

hpuhqm4ppmdfaat5s1qmt5s397

但我想改成更标准化的uuidv5

由于$session_id是传递给所有方法的参数,我能想到的唯一方法是通过在open($save_path, $session_id)方法实现中使用session_id($uuidv5)来覆盖已生成的会话id,但这似乎不太合适。

有更简洁的方法吗?


顺便说一下,如果 session_id($uuidv5) 对您有效,为什么您认为它看起来不正确?据我所知,这是唯一能够在用户空间代码中设置会话 ID 的函数。请注意,在生成会话 ID 时要有足够的熵量,以免因为(美观?)原因而遇到安全问题。通常更改会话 ID 方案会降低会话安全性的风险。 - hakre
因为这不是最优的,而且感觉很违反直觉。也许你是对的,我本来就不应该修改算法。 - NotGaeL
1个回答

2
有更简洁的方法吗?
改变底层的PHP会话ID创建函数。它使用哈希值,默认情况下是可配置的(请阅读 session.hash_function PHP ini指令session.save_handler 了解更多信息),但如果现有的配置选项不符合您的uuidv5需求,则需要通过PHP的核心代码或通过PHP扩展来添加它。
进一步的信息,正如您在评论中所抱怨的那样,“编写PHP扩展是过度的”:
用户端的PHP会话保存处理程序接口没有包含核心会话保存处理程序`s_create_sid`方法,这实际上是您要寻找的内容。这使得在用户端很难处理,因为该功能并不打算在用户端完成。
由于会话ID的创建涉及到安全问题,PHP核心开发人员已经在过去了解到在此处很容易出现错误。他们甚至不太信任其他人,特别是使用这种语言的人可以轻松更改会话ID的生成方式(这是我的猜测,否则该功能可能已导出给用户端会话保存处理程序)。
但是,您可以自己创建用于与会话ID一起使用的UUID,然后按配置的方式以会话ID的形式将其“哈希”。
然后,您可以将非哈希的值保留为UUID格式的会话变量。
如果您实际上需要在前端使用UUID,那么我倾向于说(即使这可能不太可能在SO答案中说),您所做的事情有些可疑,我会再次检查您的动机。因为技术上只需要某些ID,所以不应该有格式要求,所以我看不到任何理由不重复使用现有的会话ID。

1
据我所知,我只能配置使用的哈希类型。我不能将其设置为我想要使用的uuidv5算法。扩展PHP似乎有点过度设计... - NotGaeL
1
好吧,如果有人的要求必须得到一些XYZ-Super-Cooolie-Found-In-Some-Note-Algorithm的结果,导致费用过高,那不是我的错。别把怒火撒在我身上。另请参阅:session.save_handler(这也不是PHP核心开发人员的错。如果这是一个有用的功能,你可能需要在问题中概述为什么需要它,我认为将其纳入PHP核心是没有理由反对的)。 - hakre
1
@elcodedocle:我添加了一些更多的背景信息,解释为什么在用户空间代码中很难实现。 - hakre
1
你提供的见解非常好。这也让我质疑为什么我想要这样做。我想要uuidv5会话ID,因为我正在将我的会话存储在数据库中。我将应用程序想象成一个数据处理程序。我想尽可能多地拥有数据处理程序,并且不想关心客户端在特定请求上访问哪个特定的数据处理程序。但也许这不是一个好主意... - NotGaeL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接