`

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反序列化就可以...

    028-精通PHP序列化与反序列化之_道_.pdf

    - __wakeup():当使用unserialize()反序列化对象时自动调用。 - __toString():当对象被当作字符串使用时自动调用。 - __isset():当对不可访问属性使用isset()或empty()时自动调用。 - __unset():当对不可访问属性...

    php反序列化例题.docx

    PHP 提供了两个用于序列化和反序列化的函数:`serialize()` 和 `unserialize()`。在本文中,我们将详细介绍 PHP 反序列化的过程、示例代码、安全注意事项等。 一、PHP 反序列化的定义 PHP 反序列化是将序列化的...

    PHP 序列化和反序列化

    在PHP编程中,序列化和反序列化是两个非常重要的概念,它们主要用于数据存储和传输。下面我们将深入探讨这两个概念,以及如何在实际开发中应用它们。 **序列化(Serialization)** 序列化是将变量转换为字符串的...

    PHP中的序列化和反序列化

    在PHP中,序列化和反序列化是两种重要的数据处理技术,用于将变量转换为可存储或传输的格式,然后再恢复为原始数据结构。这两个函数,`serialize()`和`unserialize()`,是PHP内置的,用于在不同场景下处理数据。 `...

    序列化一个类_php的类的序列化脚本_

    反序列化则是通过`unserialize()`函数来实现的,它能将之前由`serialize()`产生的字符串恢复成原始对象: ```php $objRestored = unserialize($serialized); ``` ### 自定义序列化和反序列化 虽然`serialize()`和...

    PHP序列化 规则

    自PHP 3.05版本起,这两个函数开始支持对象的序列化和反序列化。然而,PHP手册中并未详细解释序列化结果的格式,这给在其他语言中实现类似功能带来了一定难度。本文将深入探讨PHP序列化的格式,以期为跨语言的数据...

    php 序列化和反序列化学习-1

    在PHP中,序列化和反序列化是两个重要的概念,它们用于将数据对象转换为字符串以便存储或传输,以及将字符串还原为原始的数据结构。在本文中,我们将深入探讨这两个概念,以及它们在PHP中的应用。 首先,让我们了解...

    详解PHP序列化和反序列化原理

    PHP通过serialize()和unserialize()两个函数来实现序列化和反序列化操作,其中,序列化后得到的字符串格式是PHP特有的,它与JSON的字符串格式类似,但并非通用的格式。 接下来,序列化过程中的自描述问题要解决的是...

    第37天:WEB漏洞-反序列化之PHP&JAVA全解(上)1

    在 PHP 中,反序列化是通过 unserialize() 函数来实现的,该函数将一个字符串还原成一个对象。然而,如果用户输入的序列化字符串未经检测,就有可能会触发魔术方法,从而导致代码执行、SQL 注入、目录遍历等不可控...

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

    - `serialize` 和 `unserialize` 是PHP中基础且常用的序列化和反序列化工具,适用于大部分情况。 - `json_encode` 和 `json_decode` 提供了更紧凑、更易读的序列化格式,且跨语言兼容性好。 - `var_export` 和 `eval...

    unserialize:jQuery 反序列化插件

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

    java序列化对象传给php

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

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

    总的来说,理解PHP的序列化和反序列化是提升PHP编程技能的关键,这不仅可以帮助我们更有效地存储和传输数据,还能让我们更好地应对可能出现的编码和安全挑战。通过熟练掌握`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 序列化和反序列化函数实例详解

    接着,我们使用`unserialize()`函数对已序列化的字符串进行反序列化,将它恢复为原始的数组形式。这个过程是相反的,`unserialize()`读取字符串`$info`,解析其中的类型标识符和数据,然后创建出与原始数组相同的...

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

    在PHP编程中,序列化和反序列化是两种非常重要的数据处理技术,它们主要用于将复杂的变量结构转换为可存储或传输的格式,然后再恢复为原始形式。本文将深入探讨这两个概念,结合实例来分析PHP中如何使用`serialize()...

    PHP中SERIALIZE和JSON的序列化与反序列化操作区别分析

    PHP提供了两种序列化和反序列化的机制,即使用serialize()和unserialize()函数进行PHP特有的序列化与反序列化,以及使用json_encode()和json_decode()函数进行JSON格式的序列化与反序列化。 首先,让我们来分析一下...

    C3P0反序列化链学习.doc

    `serialize()`和`unserialize()`方法用于序列化和反序列化这个对象,使得恶意代码能够被执行。 2. **exploit(EXP)**: `EXP`类中定义了一个静态块,该静态块在类加载时会执行。这里模拟了一个简单的命令执行操作...

Global site tag (gtag.js) - Google Analytics