从会话存储文件中读取会话数据

时间:2011-01-15 07:06:59

标签: php serialization

面对PHP unserialize()函数的问题标题为抛出错误。

unserialize() [function.unserialize]: Error at offset 0 of 1781 bytes

我还尝试了返回session_decode()

bool(false)

magic_quotes_gpcOff

好吧,我正在阅读序列化文件的内容。文件内容如下所示。

  

核心|一个:3:{S:23: “_ session_validator_data”;一个:4:{S:11: “REMOTE_ADDR”; S:15: “117.241.113.248”; S:8: “HTTP_VIA”; S 0: “”; S:20: “HTTP_X_FORWARDED_FOR”; S:0: “”,S:15: “HTTP_USER_AGENT”; S:90:“的Mozilla / 5.0   (Windows; U; Windows NT 5.1; en-US;   rv:1.9.2.13)Gecko / 20101203   火狐/ 3.6.13 “;} S:13:” session_hosts “;一个:1:{S:12:”, “; B:1;} S:8:” 消息 “O:34:” Mage_Core_Model_Message_Collection“:2 :{S:12: “^ @ * ^ @ _信息”;一个:0:{} S:20: “^ @ * ^ @ _ lastAddedMessage”; N;}}客户|一个:3:{S:23:” _session_validator_data “;一个:4:{S:11:” REMOTE_ADDR “; S:15:” 117.241.113.248 “; S:8:” HTTP_VIA “; S:0:” “; S:20:” HTTP_X_FORWARDED_FOR“; S 0: “”; S:15: “HTTP_USER_AGENT”; S:90:“的Mozilla / 5.0   (Windows; U; Windows NT 5.1; en-US;   rv:1.9.2.13)Gecko / 20101203   火狐/ 3.6.13 “;} S:13:” session_hosts “;一个:1:{S:12:”, “; B:1;} S:19:” wishlist_item_count“; I:0;}目录|一个: 3:{S:23: “_ session_validator_data”;一个:4:{S:11: “REMOTE_ADDR”; S:15: “117.241.113.248”; S:8: “HTTP_VIA”; S:0: “”; S :20: “HTTP_X_FORWARDED_FOR”; S:0: “”,S:15: “HTTP_USER_AGENT”; S:90:“的Mozilla / 5.0   (Windows; U; Windows NT 5.1; en-US;   rv:1.9.2.13)Gecko / 20101203   火狐/ 3.6.13 “;} S:13:” session_hosts “;一个:1:{S:12:”, “; B:1;} S:8:” 消息 “O:34:” Mage_Core_Model_Message_Collection“:2 :{S:12: “^ @ * ^ @ _信息”;一个:0:{} S:20: “^ @ * ^ @ _ lastAddedMessage”; N;}}结帐|一个:3:{S:23:” _session_validator_data “;一个:4:{S:11:” REMOTE_ADDR “; S:15:” 117.241.113.248 “; S:8:” HTTP_VIA “; S:0:” “; S:20:” HTTP_X_FORWARDED_FOR“; S 0: “”; S:15: “HTTP_USER_AGENT”; S:90:“的Mozilla / 5.0   (Windows; U; Windows NT 5.1; en-US;   rv:1.9.2.13)Gecko / 20101203   火狐/ 3.6.13 “;} S:13:” session_hosts “;一个:1:{S:12:”, “; B:1;} S:8:” 消息 “O:34:” Mage_Core_Model_Message_Collection“:2 :{S:12: “^ @ * ^ @ _信息”;一个:0:{} S:20: “^ @ * ^ @ _ lastAddedMessage”; N;}}

我的PHP代码在

之下
$file='/var/www/html/products/var/session/sess_0ehb7ek0hmunqo3kq70t0t6mb0';
$contents=file_get_contents($file);
$data = unserialize($contents); 
var_dump($data);

在反序列化数据之前,我已经尝试了stripslashes()。 不确定数据中的问题在哪里。 我无法更改将数据存储到文件中的机制,因为这是由Magento处理文件级别的管理会话。

6 个答案:

答案 0 :(得分:37)

如果要解码会话数据,请使用session_decode(请参阅manual)。 unserialize仅解码单个变量,而不是会话数据。

您可以执行以下操作:

$file = '/var/www/html/products/var/session/sess_ciktos8icvk11grtpkj3u610o3';
$contents = file_get_contents($file);
session_start();
session_decode($contents);
print_r($_SESSION);

答案 1 :(得分:7)

使用此课程:

    <?php
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;
    }
}
?>

用法:

<?php
Session::unserialize(file_get_contents($sessionSavePath."/".$sessionFileName);
?>

多数人工作!

答案 2 :(得分:6)

这不是合法的PHP序列化数据,即PHP会话数据。

PHP会话数据在内部使用序列化格式,但不是序列化数据本身。

唯一能安全可靠地读取会话数据的是PHP的会话代码。 有时可以使用正则表达式和一些创意编辑来阅读它,但您不能依赖这些方法。

如果您需要用户会话中的数据,最好的办法是编写自定义会话包装器,让它在数据本身更改时完成工作,而不是尝试使用数据后事实。

(我不是在谈论自定义会话编写代码,我说的是你将使用的类,而不是直接使用$_SESSION。)

答案 3 :(得分:5)

以下可以是从会话文件中读取会话数据的方法

//$file='/var/www/html/products/var/session/sess_ciktos8icvk11grtpkj3u610o3';
$sSessId = 'ciktos8icvk11grtpkj3u610o3';
session_id($sSessId);
session_start();
print_r($_SESSION);

答案 4 :(得分:2)

退房,这可能会点击你的东西

function read($filename)
{
    session_save_path("/tmp/tst");
    session_start();
    echo    $sCurrentFile = "/tmp/tst/sess_".session_id();
    $sFileToRead = $filename;
    if( !file_exists($sFileToRead) || !$sessionData=(string)@file_get_contents($sFileToRead) )
    {
        echo "file does not exist";
    }

    $fh = fopen($sCurrentFile, 'w') or die("can't open file");
    fwrite($fh, $sessionData);
    fclose($fh);
    $_SESSION["mytest"] = 444; 
    print_r($_SESSION);
}

答案 5 :(得分:-2)