Sha*_*ngh 18 php serialization
面对PHP unserialize()功能的问题,标题是抛出错误.
unserialize() [function.unserialize]: Error at offset 0 of 1781 bytes
Run Code Online (Sandbox Code Playgroud)
我也试过了session_decode()哪个回归bool(false)
magic_quotes_gpc是Off.
好吧,我正在阅读序列化的文件内容.文件内容如下所示.
芯|一个: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);
Run Code Online (Sandbox Code Playgroud)
我已经尝试了stripslashes()之前的反序列化数据.不确定数据中的问题在哪里.我无法更改将数据存储到文件中的机制,因为这是由Magento处理文件级别的管理会话.
Sta*_*asM 37
如果要解码会话数据,请使用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);
Run Code Online (Sandbox Code Playgroud)
小智 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;
}
}
?>
Run Code Online (Sandbox Code Playgroud)
用法:
<?php
Session::unserialize(file_get_contents($sessionSavePath."/".$sessionFileName);
?>
Run Code Online (Sandbox Code Playgroud)
多数民众赞成!
这不是合法的PHP序列化数据,即PHP会话数据.
PHP会话数据在内部使用序列化格式,但它本身不是序列化数据.
唯一可以安全可靠地读取会话数据的是PHP的会话代码.它有时可以使用正则表达式和一些创造性的编辑读它,但你不能依靠这些方法.
如果您需要用户会话中的数据,最好的办法是编写一个自定义会话包装器,让它在数据本身发生变化时完成工作,而不是在事后处理数据.
(我不是在谈论自定义会话编写代码,我说的是你要使用的类,而不是$_SESSION直接使用.)
以下可以是从会话文件中读取会话数据的方法
//$file='/var/www/html/products/var/session/sess_ciktos8icvk11grtpkj3u610o3';
$sSessId = 'ciktos8icvk11grtpkj3u610o3';
session_id($sSessId);
session_start();
print_r($_SESSION);
Run Code Online (Sandbox Code Playgroud)