将会话存储为JSON的PHP会话处理程序未正确解码PHP序列化


PHP session handler storing session as JSON not decoding php serialize correctly

我已经使用DynamoDB实现了一个会话处理程序。它工作正常,除了当从服务器返回响应并且我在其上调用json_decode时,嵌套的php序列化会话字符串被破坏。我假设在JSON对象中存储序列化会话是不兼容的?这是一个逃避问题吗?

问题:

  1. 有办法绕过这个吗
  2. 是否可以用JSON而不是我认为使用的php serialize()来序列化会话?这可能会解决问题

这就是原版从DB中出来时的样子(注意:它真的很长,所以我自己剪掉了结尾)

_sf2_attributes|a:4:{s:34:"_security.secured_area.target_path";s:36:"http://my.domain";s:10:"some_id";s:13:"abc123";s:8:"userData";O:27:"Some'Symfony'Bundle":49:{s:8:"�*�email";s:27:"

这就是在这个字符串所在的JSON对象上调用json_decode后的样子:

_sf2_attributes|a:4:{s:34:"_security.secured_area.target_path";s:36:"http://my.domain";s:10:"some_id";s:13:"abc123";s:8:"userData";O:27:"Some'Symfony'Bundle":49:{s:8:"

在原件中星号所在的位置,它似乎被截断了。

json和序列化在PHP 中运行良好

class ClassA
    {
    public $publicMember;
    private $privateMember;
    protected $protected;
    }
$object = new ClassA();
var_dump(unserialize(json_decode(json_encode(serialize($object)))));

但这个问题可能来自DynamoDB:PHP的DynamoDB/DynmoDB会话处理程序中的Bug(NULL BYTES的处理)。它似乎关闭了,但是。。。您可以在json_encode 之前使用base64_encode添加额外的包装

var_dump(unserialize(base64_decode(json_decode(json_encode(base64_encode(serialize($object)))))));