【问题标题】:Python unserialize PHP sessionPython 反序列化 PHP 会话
【发布时间】:2013-10-05 11:22:07
【问题描述】:

我一直在尝试使用 phpserializeserek's 模块(从 Unserialize PHP data in python 获得)在 Python 中反序列化 PHP 会话数据,但似乎不可能我。

两个模块都希望 PHP 会话数据类似于:

a:2:{s:3:"Usr";s:5:"AxL11";s:2:"Id";s:1:"2";}

但是session文件中存储的数据是:

Id|s:1:"2";Usr|s:5:"AxL11";

非常感谢任何帮助。

【问题讨论】:

  • 使用 phpserialize 我曾尝试执行以下操作:>>> loads('a:2:{s:3:"Usr";s:5:"AxL11";s:2:"Id";s:1:"2";}') {'Usr': 'AxL11', 'Id': '2'} 如您所见,这是可行的,但我的真实 PHP 会话数据存储在文件中:>>> loads('Id|s:1:"2";Usr|s:5:"AxL11";') 我在 _expect 中的 phpserialize.py",第 444 行得到一个 ValueError
  • 在我的 php.ini 文件中,我有以下内容: session.serialize_handler = php 更多信息在link
  • 在 Google 上到达第 3 页后,我发现原始 phpserializefork 与我提供的字符串一起使用:>>> loads('Id|s:1:"2";Usr|s:5:"AxL11";') {'Id': '2', 'Usr': 'AxL11'}

标签: php python session serialization


【解决方案1】:

在 Google 上到达第 3 页后,我发现原始应用程序 phpserializefork 与我提供的字符串一起使用:

>>> loads('Id|s:1:"2";Usr|s:5:"AxL11";')
{'Id': '2', 'Usr': 'AxL11'}

【讨论】:

  • fork 不适用于 Python 3。Armin Ronacher 的原始代码经过精心设计为 2/3 多语言,但是这个 fork 破坏了它。请参阅我的答案以获得更好的解决方案。
【解决方案2】:

用于 PHP session 序列化的默认算法 不是 serialize 使用的算法,而是另一种称为 @987654322 的内部 broken 格式@, 哪个

不能在$_SESSION.中存储数字索引或字符串索引包含特殊字符(|!


正确的解决方案是将残缺的默认会话序列化格式更改为 Armin Ronacher 的原始 phpserialize 库支持的格式,甚至通过更改 session.serialize_handler 将序列化和反序列化为 JSON INI 设置。

我决定在 PHP 端使用前者以获得最大的兼容性

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

这使得新会话与标准 phpserialize 兼容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-26
    • 2015-12-09
    • 2015-03-31
    • 1970-01-01
    • 2014-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多