【问题标题】:Unserialize PHP session data反序列化 PHP 会话数据
【发布时间】:2015-06-27 16:34:48
【问题描述】:

我正在使用带有数据库会话驱动程序的 CodeIgniter 3.x,并且我想访问 data cloumn BLOB 类型。这是我的 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']

【问题讨论】:

  • 您是否在会话中存储“BLOB”数据?这是一种有趣的方法。您是否知道“会话数据”在 PHP 脚本结束时会自动序列化,而在您再次“启动会话”时会“取消序列化”。你为什么在“会话数据”上使用unserialize($string)?除非您在将其添加到会话时对其进行“序列化”?
  • @RyanVincent 不是我!此数据是会话并由 CodeIgniter 存储。我试图访问 BLOB 数据元素,但无法访问。当我回显blob 数据时,上面的字符串看起来像序列化数据,但unserialize 不起作用。这个字符串是什么类型的?
  • @RyanVincent 我必须告诉你所有 CodeIgniter 核心和会话库:)
  • 对不起,我误解了这个问题。

标签: php codeigniter session


【解决方案1】:

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

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

【讨论】:

  • 会话是使用 PHP 的内部序列化函数php_serialize 进行序列化的,因此通过使用这种方法进行反序列化,无需写入$_SESSION 即可取回数据。在此处查看unserialize_phpphp.net/manual/fr/function.session-decode.php#108037
  • 这是一个用户提供的函数,并且不是二进制安全的。
  • 仍然比将另一个用户的会话数据添加到自己的更好......不过它适用于大多数情况。
  • 两者都不是更好,这就是为什么我的回答说这个想法首先是错误的。
  • 我们要评判谁? OP想要做,让他做是我的回答。
【解决方案2】:

我在这里找到了解决方案

所以我使用了会话解码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'];

【讨论】:

【解决方案3】:

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2013-10-05
    • 1970-01-01
    • 2012-02-09
    • 2015-03-31
    • 1970-01-01
    • 2014-11-18
    • 2011-12-26
    • 2015-12-09
    • 1970-01-01
    相关资源
    最近更新 更多