`
xdlliutao
  • 浏览: 37841 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

PHP教程-反序列化的方法

php 
阅读更多



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



1. serialize和unserialize函数



这两个是序列化和反序列化PHP中数据的常用函数。

<?php

$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut');

//序列化数组

$s = serialize($a);

echo $s;

//输出结果:a:3:{s:1:"a";s:5:"Apple";s:1:"b";s:6:"banana";s:1:"c";s:7:"Coconut";}

echo '<br /><br />';

//反序列化

$o = unserialize($s);

print_r($o);

//输出结果 Array ( [a] => Apple [b] => banana [c] => Coconut )

?>

当数组值包含如双引号、单引号或冒号等字符时,它们被反序列化后,可能会出现问题。为了克服这个问题,一个巧妙的技巧是使用base64_encode和base64_decode。

$obj = array();

//序列化

$s = base64_encode(serialize($obj));

//反序列化

$original = unserialize(base64_decode($s));

但是base64编码将增加字符串的长度。为了克服这个问题,可以和gzcompress一起使用。

//定义一个用来序列化对象的函数

function my_serialize( $obj )

{

   return base64_encode(gzcompress(serialize($obj)));

}

//反序列化

function my_unserialize($txt)

{

   return unserialize(gzuncompress(base64_decode($txt)));

}

2. json_encode 和 json_decode



使用JSON格式序列化和反序列化是一个不错的选择:



使用json_encode和json_decode格式输出要serialize和unserialize格式快得多。

JSON格式是可读的。

JSON格式比serialize返回数据结果小。

JSON格式是开放的、可移植的。其他语言也可以使用它。

$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut');

//序列化数组

$s = json_encode($a);

echo $s;

//输出结果:{"a":"Apple","b":"banana","c":"Coconut"}

echo '<br /><br />';

//反序列化

$o = json_decode($s);

在上面的例子中,json_encode输出长度比上个例子中serialize输出长度显然要短。



3. var_export 和 eval



var_export 函数把变量作为一个字符串输出;eval把字符串当成PHP代码来执行,反序列化得到最初变量的内容。



$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut');



//序列化数组



$s = var_export($a , true);



echo $s;



//输出结果: array ( 'a' => 'Apple', 'b' => 'banana', 'c' => 'Coconut', )



echo '<br /><br />';



//反序列化



eval('$my_var=' . $s . ';');



print_r($my_var);

4. wddx_serialize_value 和 wddx deserialize



wddx_serialize_value函数可以序列化数组变量,并以XML字符串形式输出。



$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut');



//序列化数组

$s = wddx_serialize_value($a);

echo $s;



//输出结果(查看输出字符串的源码):<wddxPacket version='1.0'><header/><data><struct><var name='a'><string>Apple</string></var><var name='b'><string>banana</string></var><var name='c'><string>Coconut</string></var></struct></data></wddxPacket>



echo '<br /><br />';



//反序列化

$o = wddx_deserialize($s);

print_r($o);

//输出结果:Array ( [a] => Apple [b] => banana 1 => Coconut )

可以看出,XML标签字符较多,导致这种格式的序列化还是占了很多空间。



小结



上述所有的函数在序列化数组变量时都能正常执行,但运用到对象就不同了。例如json_encode序列化对象就会失败。反序列化对象时,unserialize和eval将有不同的效果。
分享到:
评论

相关推荐

    php反序列化靶场,集合了常见的php反序列化漏洞——由这周末在做梦制作.zip

    通过构建类似实际网络的拓扑结构、部署各种安全设备和应用,靶场可以模拟出多样化的网络攻防场景。这使得安全人员能够在安全的环境中进行实际操作,全面提升其实战能力。 其次,靶场是渗透测试和漏洞攻防演练的理想...

    PHP序列化操作方法分析

    PHP允许在序列化和反序列化时使用类的魔术方法来增加额外的功能。 - `__sleep()` 方法:在对象被序列化前调用,可以用于执行清理操作,关闭数据库连接等。在序列化过程中,只序列化`__sleep()`方法返回的属性列表。...

    PHP自定义序列化接口Serializable用法分析

    需要注意的是,当对象的实例进行序列化时,PHP不会自动调用对象的__sleep()方法,进行反序列化时,也不会自动调用__wakeup()和__construct()方法。 让我们通过一个具体的例子来分析PHP自定义序列化接口Serializable...

    protobuf-php-3.17.0

    3. 序列化和反序列化:protobuf库提供了方法,可以将数据对象转化为二进制流进行存储或传输,反之也能从二进制流恢复数据对象。 在PHP中使用protobuf,开发者首先需要安装protobuf扩展,然后定义数据结构的.proto...

    第53天:代码审计-TP5框架及无框架变量覆盖反序列化1

    当使用`serialize()`和`unserialize()`时,攻击者可能通过构造恶意序列化数据来触发特定的魔术方法,如`__wakeup()`, `__sleep()`, `__destruct()`, 等。应避免在不受控的情况下使用`unserialize`,并确保对象实例...

    php_igbinary-2.0.8-7.3-ts-vc15-x64.zip

    相比默认的PHP序列化(serialize)和反序列化(unserialize)方法,igbinary能够显著提升性能,特别是在大型数据结构或者频繁序列化操作的应用场景中。 描述中提到的“部署文档:...

    PHP100视频教程73:PHP.MemCached高级缓存配置.rar

    - **自定义序列化/反序列化**:使用`setOption()`设置序列化方法,控制数据的存储格式。 4. **最佳实践** - **缓存策略**:根据业务需求选择合适的缓存策略,如:全量缓存、增量缓存、LRU(Least Recently Used)...

    Laravel开发-laravel-serializer .zip

    在Laravel框架中,Serializer是处理数据序列化和反序列化的关键组件,它允许开发者将复杂的PHP对象转换为JSON或其他格式,以便于网络传输或存储。在这个“Laravel开发-laravel-serializer .zip”文件中,很可能是...

    PHP100视频教程74:PHP.MemCached.高级缓存应用.rar

    虽然Memcached的数据存储在内存中,但可以通过序列化和反序列化数据来实现一定程度的持久化。 五、性能优化 1. 并行操作: 利用PHP的多线程或异步特性,可以同时执行多个Memcached操作,提高效率。 2. 适当分片:...

    PHPweb2.0网站开发高级开发技术—PHP面向对象编程介绍

    使用`serialize()`方法进行序列化,`unserialize()`进行反序列化。 **9. 异常处理** PHP使用`try-catch`语句块处理运行时错误,通过`throw`抛出异常,`catch`捕获并处理异常。 **总结** PHP的面向对象编程提供了...

    PHP5设计模式电子教程PDF全书

    在PHP中,我们可以使用序列化和反序列化来实现备忘录模式。 最后,适配器模式是将两个不兼容的接口进行桥接,使得原本无法一起工作的类能够协同工作。在PHP中,我们可以通过继承或组合来实现适配器,使得旧代码可以...

    php_redis.dll php_igbinar.dll 5.6版

    igbinary扩展能够优化PHP对象在内存中的序列化和反序列化过程,相比默认的序列化方式(如`serialize`和`unserialize`),igbinary可以显著减少内存占用和提高处理速度。这对于大规模的数据交换或内存数据库如Redis来...

    ajax基础与实践教程(含php json实例)

    在Ajax中,JSON常用于数据的序列化和反序列化。由于JSON格式与JavaScript对象语法高度相似,因此在JavaScript中处理JSON数据非常方便。 **PHP与Ajax结合** PHP作为服务器端脚本语言,可以生成JSON数据供Ajax调用。...

    韩顺平 PHP Memcached缓存技术资料源码笔记图解PPT_Ady

    - 序列化:自动处理非字符串类型数据的序列化和反序列化。 - 键空间通知:通过监听键空间事件,实现数据变更的实时响应。 五、最佳实践 1. 使用合理的键名:键名应具有描述性且尽可能短,避免内存浪费。 2. 预估...

    CTF Web各种题目的解题姿势

    课时2:PHP反序列化识别与利用14'22 课时3:PHP序列化特殊点介绍15'28 课时4:魔术方法20'35 课时5:序列化漏洞案例 - 任意命令执行05'53 课时6:Phar反序列化10'38 第7章 第7章 Python基础 课时1:7.1-...

    AWD WAF watch bird 文件监控 不死马下载

    1.该waf 1000多行,可防御一句话木马 注入 反序列化 命令执行,非65行只过滤的waf可比。 2.编译waf.c生成.so文件 waf.so (已编译) 3.将waf.so,watchbird.php文件存放在/var/www/html或其他目录中(/tmp) 4 每个...

    thrift中文简易教程

    - **TJSONProtocol**:使用 JSON 格式进行序列化和反序列化。 ##### 2.4 版本控制 (Versioning) Thrift 支持服务版本控制,可以在不破坏现有客户端的情况下升级服务。这意味着你可以更改服务接口,增加新的方法...

    php java编程手册

    5. 输入/输出流:文件操作,网络通信,序列化和反序列化。 6. 多线程:线程的创建、同步、通信和生命周期管理。 7. Java EE:Servlet、JSP、EJB等企业级开发技术,以及MVC设计模式的应用。 该手册作为学习工具,...

    thrift入门学习教程

    - **TProtocol**:定义了Thrift数据的序列化和反序列化方式。 - **TTransport**:负责数据的实际传输。 - **底层I/O通信**:提供了各种网络传输方式,如TCP、UDP等。 **3. 数据类型** Thrift支持以下几种数据类型...

    xml.rar_php xml

    学习PHP与XML的结合应用对于Web开发人员来说是必要的,因为这不仅可以帮助处理服务器和客户端的数据交换,还可以与各种API和服务进行交互,实现数据的序列化和反序列化。通过深入理解这些XML处理工具,你将能够更好...

Global site tag (gtag.js) - Google Analytics