[使用与对象的CodeIgniter 2.2会话时出现Unserialize()偏移错误

问题描述 投票:1回答:2

我正在尝试从CodeIgniter 2.2调试一些旧代码。通过会话运行某些数据时,我注意到一个反序列化错误,消息:unserialize():偏移量160处为163字节的错误。经过一些调试和研究后,我发现从一个序列化数据时反序列化是一个常见的反斜线问题。会话。

我正在使用的序列化数据中包含带有反斜杠的数据对象,这会导致发生错误。我需要一个可以处理标准类对象的替代品。

有人可以建议快速替换Codeigniter的Session _serialize()和_unserialize()方法吗?

public function data_test() {

    $input = array(
        (object)array('name' => 'test2', 'desc' => 'bla bla ob/gyn'),
        (object)array('name' => 'test2', 'desc' => 'bla bla ob\\gyn'),
    );
    var_dump($input);

    $data = $this->_serialize($input);
    var_dump($data);

    $result = $this->_unserialize($data);
    var_dump($result);


}



// --------------------------------------------------------------------

/**
 * Serialize an array
 *
 * This function first converts any slashes found in the array to a temporary
 * marker, so when it gets unserialized the slashes will be preserved
 *
 * @access  private
 * @param   array
 * @return  string
 */
function _serialize($data) {
    if (is_array($data)) {
        foreach ($data as $key => $val) {
            if (is_string($val)) {
                $data[$key] = str_replace('\\', '{{slash}}', $val);
            }
        }
    } else {
        if (is_string($data)) {
            $data = str_replace('\\', '{{slash}}', $data);
        }
    }

    return serialize($data);
}

// --------------------------------------------------------------------

/**
 * Unserialize
 *
 * This function unserializes a data string, then converts any
 * temporary slash markers back to actual slashes
 *
 * @access  private
 * @param   array
 * @return  string
 */
function _unserialize($data) {

    $data = unserialize(strip_slashes($data));

    if (is_array($data)) {
        foreach ($data as $key => $val) {
            if (is_string($val)) {
                $data[$key] = str_replace('{{slash}}', '\\', $val);
            }
        }

        return $data;
    }

    return (is_string($data)) ? str_replace('{{slash}}', '\\', $data) : $data;
}
php codeigniter session serialization codeigniter-2
2个回答
1
投票
/**
 * Serialize an array
 *
 * This function serializes the data and then base64_encodes it for 
 * storage with memcached. This avoids the common backslash issue.
 *
 * @access  private
 * @param   array
 * @return  string
 */
function _serialize($data) {
    return base64_encode(serialize($data));
}

// --------------------------------------------------------------------

/**
 * Unserialize
 *
 * This function unserializes a data string. I first base64_decodes
 * the data from memcached storage.
 */
function _unserialize($data) {
    return unserialize(base64_decode($data));
}

0
投票

如果您使用不同版本的PHP,或者更改了在打开会话时使用的PHP版本,有时可能会遇到此问题。

例如,如果您有一个使用PHP 5.6。*的应用程序的会话cookie,然后尝试将其与使用PHP 7.2。*的应用程序(位于另一个子域中)一起使用,那么您将收到警告错误。或者,如果您有一个开放的会话,然后更改了与应用程序一起使用的PHP版本(例如,如果您是在本地开发并切换PHP版本),则会收到警告。因此最好使用序列化/反序列化以及PHP版本不更改的方式。

© www.soinside.com 2019 - 2024. All rights reserved.