当前位置:  开发笔记 > 编程语言 > 正文

如何将会话数据反序列化为PHP中的任意变量?

如何解决《如何将会话数据反序列化为PHP中的任意变量?》经验,为你挑选了2个好方法。

我想将session_encode()一串会话数据反序列化到我自己的数组(即不是$_SESSION.)

似乎没有内置函数来处理这个问题.还有session_decode(),而是直接写入$_SESSION超级全局.有unserialize()但它返回虚假的session_encode(),因为他们是一个稍微不同的格式"D弦.

最好的方法是什么?

编辑:这是我使用的代码:http://us.php.net/manual/en/function.session-decode.php#79244



1> Halcyon..:

我注意到用于手动解码会话的已发布解决方案(在php.net上)并不完美,因此我提供了更强大的解决方案.

preg_match解决方案永远不会工作.找到一个可能会破坏反序列化的案例并不难.在jason-joeymail的情况下休息:

$_SESSION["test"] = ";oops|";

下面你可以找到我的解决方案.它不使用正则表达式,而是使用序列化操作的可逆性,并且序列化的"特征"在认为已完成时忽略所有进一步的输入.它绝不是一个美观或特别快的解决方案,但它是一个更强大的解决方案.我为"php"和"php_binary"添加了一个反序列化器.为"wddx"添加一个应该是微不足道的.

class Session {
    public static function unserialize($session_data) {
        $method = ini_get("session.serialize_handler");
        switch ($method) {
            case "php":
                return self::unserialize_php($session_data);
                break;
            case "php_binary":
                return self::unserialize_phpbinary($session_data);
                break;
            default:
                throw new Exception("Unsupported session.serialize_handler: " . $method . ". Supported: php, php_binary");
        }
    }

    private static function unserialize_php($session_data) {
        $return_data = array();
        $offset = 0;
        while ($offset < strlen($session_data)) {
            if (!strstr(substr($session_data, $offset), "|")) {
                throw new Exception("invalid data, remaining: " . substr($session_data, $offset));
            }
            $pos = strpos($session_data, "|", $offset);
            $num = $pos - $offset;
            $varname = substr($session_data, $offset, $num);
            $offset += $num + 1;
            $data = unserialize(substr($session_data, $offset));
            $return_data[$varname] = $data;
            $offset += strlen(serialize($data));
        }
        return $return_data;
    }

    private static function unserialize_phpbinary($session_data) {
        $return_data = array();
        $offset = 0;
        while ($offset < strlen($session_data)) {
            $num = ord($session_data[$offset]);
            $offset += 1;
            $varname = substr($session_data, $offset, $num);
            $offset += $num;
            $data = unserialize(substr($session_data, $offset));
            $return_data[$varname] = $data;
            $offset += strlen(serialize($data));
        }
        return $return_data;
    }
}

用法:

Session::unserialize(session_encode());



2> Paolo Bergan..:

查看PHP手册session_decode页面中的注释.它有一堆用户函数来session_encode手动解码字符串.据我所知,这是唯一的出路.

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有