会话类的循环依赖关系避免


Circular dependency avoidance with Session class

问题涉及两个类,即SessionEncryption

为了进一步保护会话数据,我扩展了内置的SessionHandler,并在写入时加密序列化的会话数据。

为了提高网站其他各个区域的安全性,对一些数据进行了加密。系统将Encryption类的初始化向量存储在$_SESSION变量中,由Session类管理。

这是循环依赖的一个非常明显的例子。我提出的避免这种情况的选项都包括绕过一个或另一个类,直接使用内置工具。

但这会带来其他问题!目前,我使用RIJNDAEL_256进行所有加密,如果需要更新,代码将有2个位置需要更改(到最后可能会更多)。

在保持当前功能的同时,如何避免出现这种情况?

加密初始化向量没有意义,因为它不是密钥,不需要保密。这将删除您的循环依赖关系。[1] [2]

至于指定当前的加密算法,我不确定你在哪里有双重性。理想情况下,在方法或项目配置中,您应该有一个位置,指定当前使用的算法,并让感兴趣的各方使用这个通用值。

解决方案最终相当简单。首先,我将Encryption类的$iv更改为static。由于事实证明不可能像peter建议的那样使用SessionHandler::write()仅加密部分会话数据(write()是全部或全部),因此现在使用ECB模式对会话数据本身进行加密(所有其他加密使用涉及iv的模式)。

在会话启动时,从以前的会话数据中提取iv(如果不存在/已过期,则创建iv),并将其应用于Encryption类中的静态$iv属性。因此,Encryption不再依赖于Session,并且$iv属性在所有实例中都可用!