簡體   English   中英

從會話存儲文件中讀取會話數據

[英]Read the session data from session storage file

面對PHP unserialize()函數的問題標題為拋出錯誤。

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

我也嘗試了返回bool(false)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 Firefox / 3.6.13“;} s:13:”session_hosts“; a:1:{s:12:”“; b:1;} s:8:”messages“; 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 Firefox / 3.6.13“;} s:13:”session_hosts“; a:1:{s:12:”“; b:1;} s:8:”messages“; O: 34: “Mage_Core_Model_Message_Collection”:2:{S:12: “^ @ * ^ @ _信息”;一個:0:{} S:20: “^ @ * ^ @ _ lastAddedMessage”; N;}}結帳| A: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 Firefox / 3.6.13“;} s:13:”session_hosts“; a:1:{s:12:”“; b:1;} s:8:”messages“; ○: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處理文件級別的管理會話。

如果要解碼會話數據,請使用session_decode (請參閱手冊 )。 unserialize只解碼單個變量,而不是會話數據。

你可以這樣做:

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

使用這個類:

    <?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);
?>

多數民眾贊成!

這不是合法的PHP序列化數據,即PHP會話數據。

PHP會話數據在內部使用序列化格式,但它本身不是序列化數據。

唯一可以安全可靠地讀取會話數據的是PHP的會話代碼。 有時可以使用正則表達式和一些創意編輯來閱讀它,但您不能依賴這些方法。

如果您需要用戶會話中的數據,最好的辦法是編寫一個自定義會話包裝器,讓它在數據本身發生變化時完成工作,而不是在事后處理數據。

(我不是在談論自定義會話編寫代碼,我說的是你將使用的類,而不是直接使用$_SESSION 。)

以下可以是從會話文件中讀取會話數據的方法

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

退房,這可能會點擊你的東西

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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM