`

PHP反序列化unserialize 出现bool false 解决办法

    博客分类:
  • PHP
 
阅读更多

php 提供serialize(序列化) 与unserialize(反序列化)方法。

使用serialize序列化后,再使用unserialize反序列化就可以获取原来的数据。

<?php  
$arr = array(  
    'name' => 'fdipzone',  
    'gender' => 'male'  
);  
  
$str = serialize($arr); //序列化  
echo 'serialize str:'.$str."\r\n\r\n";  
  
$content = unserialize($str); // 反序列化  
echo "unserialize str:\r\n";  
var_dump($content);  
?> 

 输出:

 

 

 

serialize str:a:2:{s:4:"name";s:8:"fdipzone";s:6:"gender";s:4:"male";}  
  
unserialize str:  
array(2) {  
  ["name"]=>  
  string(8) "fdipzone"  
  ["gender"]=>  
  string(4) "male"  
}  

 但下面这个例子反序列化会返回false

<?php  
$str = 'a:9:{s:4:"time";i:1405306402;s:4:"name";s:6:"新晨";s:5:"url";s:1:"-";s:4:"word";s:1:"-";s:5:"rpage";s:29:"http://www.baidu.com/test.html";s:5:"cpage";s:1:"-";s:2:"ip";s:15:"117.151.180.150";s:7:"ip_city";s:31:"中国北京市 北京市移动";s:4:"miao";s:1:"5";}';  
var_dump(unserialize($str)); // bool(false)  
?>  

 检查序列化后的字符串,发现出问题是在两处地方

 

s:5:"url"

s:29:"http://www.baidu.com/test.html"

这两处应为

s:3:"url"

s:30:"http://www.baidu.com/test.html"

 

出现这种问题的原因是序列化数据时的编码与反序列化时的编码不一致导致,例如数据库是latin1和UTF-8字符长度不一样。

另外有可能出问题的还有单双引号,ascii字符"\0"被解析为 '\0',\0在C中是字符串的结束符等于chr(0),错误解析后算了2个字符。

\r在计算长度时也会出问题。

解决方法如下:

 

// utf8  
function mb_unserialize($serial_str) {  
    $serial_str= preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $serial_str );  
    $serial_str= str_replace("\r", "", $serial_str);  
    return unserialize($serial_str);  
}  
  
// ascii  
function asc_unserialize($serial_str) {  
    $serial_str = preg_replace('!s:(\d+):"(.*?)";!se', '"s:".strlen("$2").":\"$2\";"', $serial_str );  
    $serial_str= str_replace("\r", "", $serial_str);  
    return unserialize($serial_str);  
}  

 转自:http://blog.csdn.net/fdipzone/article/details/38071115

分享到:
评论

相关推荐

    php中unserialize返回false的解决方法

    本文实例讲述了php中unserialize返回false的解决方法,分享给大家供大家参考。具体方法如下: php 提供serialize(序列化) 与unserialize(反序列化)方法。 使用serialize序列化后,再使用unserialize反序列化就可以...

    unserialize:PHP 反序列化的 Node.js 端口

    PHP 反序列化的 Node.js 端口 安装 npm install unserialize 用法 var unserialize = require('unserialize'); console.log(unserialize('a:2:{s:4:"name";s:4:"Andy";s:3:"age";i:82;}')); // { name: 'Andy', ...

    详解PHP序列化反序列化的方法

    php 将数据序列化和反序列化其实就用到两个函数,serialize 和unserialize。 serialize 将数组格式化成有序的字符串 unserialize 将数组还原成数组 例如: $user=array('Moe','Larry','Curly'); $user=serialize($...

    解析PHP多种序列化与反序列化的方法

    1. serialize和unserialize函数这两个是序列化和反序列化PHP中数据的常用函数。复制代码 代码如下:&lt;?php$a = array(‘a’=&gt; ‘Apple’ ,’b’ =&gt; ‘banana’, ‘c’ =&gt; ‘Coconut’);//序列化数组$s = serialize...

    java序列化对象传给php

    android(包括java)序列化一个对象传给php去做处理,或是接到php的序列化的对象在java中做处理的工具jar包以及使用方法. 使用方法: byte[] b = null;...PHPSerializer中还有unserialize方法,是反序列化

    PHP常见的序列化与反序列化操作实例分析

    主要介绍了PHP常见的序列化与反序列化操作,结合实例形式分析了php使用serialize()及unserialize()进行序列化与反序列化相关操作技巧及注意事项,需要的朋友可以参考下

    PHP多种序列化/反序列化的方法详解

    反序列化就是在适当的时候把这个字符串再转化成原来的变量使用。这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性.. 序列化是将变量转换为可保存或传输的字符串的过程;反序列化就是在适当的时候把...

    unserialize:jQuery 反序列化插件

    反序列化 jQuery 反序列化插件 概述: 这个插件包含两个函数,它们的工作方式与 jQuery 的“serialize()”函数相反。 也就是说,“序列化”采用一种形式(或输入的集合)并为 HTTP 请求返回正确的序列化字符串,此...

    PHP 序列化和反序列化函数实例详解

    序列化与反序列化 把复杂的数据类型压缩到一个字符串中 serialize() 把变量和它们的值编码成文本形式 unserialize() 恢复原先变量  1.创建一个$arr数组用于储存用户基本信息,并在浏览器中输出查看结果; $arr=...

    tsqlphpunserialize:在 T-SQL 中反序列化 PHP 序列化数据

    tsqlphpunserialize 在 T-SQL 中反序列化 PHP 序列化数据最初发布在 Stack Exchange 上: : noredirect=1# 我正在尝试从 Magento 订单中提取礼品卡代码。 其他一些代码使用 Magento API 从 Magento 检索订单信息作为...

    php-serializer:以任何格式序列化PHP变量,包括对象。 也支持反序列化

    PHP序列化器安装使用安装软件包: $ composer require nilportugues/serializer介绍什么是序列化? 在数据存储的上下文中,序列化是将数据结构或对象状态转换为可以存储(例如,在文件或内存缓冲区中或通过网络连接...

    php中序列化与反序列化详解

    unserialize() 恢复原先变量 eg: $stooges = array('Moe','Larry','Curly'); $new = serialize($stooges); print_r($new);echo ; print_r(unserialize($new)); 结果:a:3:{i:0;s:3:”Moe”;i:1;s:5:”Larry”;i...

    PHP序列化/对象注入漏洞分析

    本文是关于PHP序列化/对象注入漏洞分析的短篇,里面讲述了如何获取主机的远程shell。 如果你想自行测试这个漏洞,你可以通过 XVWA 和 Kevgir 进行操作。 漏洞利用的第一步,我们开始测试目标应用...然后再进行反序列化

    PHP序列化操作方法分析

    序列化就是将变量数据转换为字符串(跟类型转换机制不同),一般应用于存储数据(文件),然后在别的情形下恢复(反序列化) 序列化: $val = serialize($var); file_put_contents('./*.txt',$val); 反序列化: $...

    php序列化函数serialize() 和 unserialize() 与原生函数对比

    主要介绍了php序列化函数serialize() 和 unserialize() 与php原生序列化方法对比,有需要的小伙伴可以参考下。

    weblogic_unserialize_exploit:Java反序列化vul以进行weblogic利用

    weblogic unserialize exploitjava反序列化漏洞(CVE-2015-4852)的weblogic exploit命令回显exp1.依赖组件python 2.7java2. 程序说明exploit方法来源于Freebuf的”Java反序列化漏洞之weblogic本地利用实现篇”,...

    python序列化中的字符串,列表,字典,类的序列化解释

    我们知道现在各大语言都有其序列化数据和反序列的方式, 比如php的serialize和unserialize函数 Python当然也有,官方库里提供了一个叫做pickle的库 字符串的序列化解释 import pickle x = "yuaneuro" y = pickle....

    php-serializer:用于快速操作大型序列化数组的库

    好吧,为这样一个简单的操作反序列化整个数组是非常低效的。 如果您正在反序列化一个小数组或者您不经常这样做,那么这可能没问题,但如果您处于重负载设置中,则必须有更好的方法。 PHPSerializer 背后的想法本质...

Global site tag (gtag.js) - Google Analytics