反序列化PHP会话数据

时间:2015-06-27 16:34:49

标签: php codeigniter session

我正在使用CodeIgniter 3.x和数据库会话驱动程序,我想访问data类型为BLOB的cloumn。这是我的blob数据:

__ci_last_regenerate|i:1435420891;identity|s:13:"john@doe.com ";username|s:13:"johndoe";email|s:13:"john@doe.com ";user_id|s:1:"5";old_last_login|s:10:"1435412865";

我试过unserialize($string),但没有用!

  

unserialize():偏移0处的错误

如何访问blob数据元素?例如:$user['email']

3 个答案:

答案 0 :(得分:1)

没有直接的方法来做到这一点......您可以使用session_decode(),但它要求您已经有一个活动会话,以便它可以将解码后的数据放入{{ 1}}。

但是,我必须告诉你,如果你想这样做 - 你做错了。您永远不应该访问其他用户的会话。如果有一些数据与会话相关联,并且对于拥有该会话的用户不明确,则应该在会话表中添加另一个字段并将其保存在那里。

答案 1 :(得分:0)

我在这里得到了解决方案

所以我使用了会话解码http://php.net/session_decode

session_decode('__ci_last_regenerate|i:1446535049;ci_UserID|s:1:"2";ci_UserName|s:24:"example@xyz.com";logged_in|b:1;');

因此会话解码在正常的php会话中存储了所有加密数据。

我可以使用以下方式访问:

echo $_SESSION['ci_UserID'];

答案 2 :(得分:0)

正如纳尔夫所说,没有简单的方法可以做到这一点。

ykay; s解决方案假定您正在使用当前内置的会话处理程序。该值可以由应用程序随时更改,并且不能保证PHP会保留此格式。

您的解决方案破坏了当前会话,并将其替换为存储的数据(但至少它将使用“当前”序列化方法)。

可以在运行时覆盖序列化函数和session_函数的读/写操作。只要您回读使用与用于解码的机制相同的机制编码的数据即可,但是对于长期存储数据或在无法保证PHP安装读取一致性的情况下使用,这是一种不好的方法。数据。

解决在用户会话之外读取会话数据的问题的正确方法是使用序列化/非序列化格式:

ini_set("session.serialize_handler", 'php_serialize');

然后使用unserialize()读取数据。