我一直在尝试通过使用phpserialize和serek 的模块(从Python 中的Unserialize PHP data 获得)来反序列化 Python 中的 PHP 会话数据,但这对我来说似乎是不可能的。
两个模块都希望 PHP 会话数据如下所示:
a:2:{s:3:"Usr";s:5:"AxL11";s:2:"Id";s:1:"2";}
但是会话文件中存储的数据是:
Id|s:1:"2";Usr|s:5:"AxL11";
任何帮助将不胜感激。
我一直在尝试通过使用phpserialize和serek 的模块(从Python 中的Unserialize PHP data 获得)来反序列化 Python 中的 PHP 会话数据,但这对我来说似乎是不可能的。
两个模块都希望 PHP 会话数据如下所示:
a:2:{s:3:"Usr";s:5:"AxL11";s:2:"Id";s:1:"2";}
但是会话文件中存储的数据是:
Id|s:1:"2";Usr|s:5:"AxL11";
任何帮助将不胜感激。
在 Google 上到达第 3 页后,我发现原始应用程序phpserialize的一个分支与我提供的字符串一起使用:
>>> loads('Id|s:1:"2";Usr|s:5:"AxL11";')
{'Id': '2', 'Usr': 'AxL11'}
用于 PHP会话序列化的默认算法不是使用的算法serialize
,而是另一种称为内部损坏的格式php
,它
不能存储数字索引或字符串索引包含特殊字符(
|
和!
)$_SESSION.
正确的解决方案是通过更改INI 设置,将残缺的默认会话序列化格式更改为Armin Ronacher 的原始phpserialize
库支持的格式,甚至将其序列化和反序列化为 JSON 。session.serialize_handler
我决定在 PHP 端使用前者以获得最大的兼容性,方法是使用
ini_set('session.serialize_handler', 'php_serialize')
这使得新会话与标准兼容phpserialize
。