资讯专栏INFORMATION COLUMN

PHP序列化和反序列化注意什么

Tangpj / 1170人阅读

摘要:和函数这两个是序列化和反序列化中数据的常用函数。序列化数组输出结果反序列化输出结果当数组值包含如双引号单引号或冒号等字符时,它们被反序列化后,可能会出现问题。序列化反序列化但是编码将增加字符串的长度。序列化数组输出结果反序列化

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

serialize和unserialize函数

这两个是序列化和反序列化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 "

";

//反序列化

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

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 "

";

//反序列化

$o = json_decode($s);

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

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 "

";

//反序列化

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

print_r($my_var);

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/22727.html

相关文章

  • PHP列化漏洞系列之–PHP列化和反列化原理

    0.前言 本文为笃行日常学习记录,web安全php漏洞系列。 对象的序列化和反序列化作用就不再赘述,php中序列化的结果是一个php自定义的字符串格式,有点类似json. 我们在任何语言中设计对象的序列化和反序列化都需要解决几个问题 把某个对象序列化之后,序列化的结果有自描述的功能(从序列化的结果中知道这个对象的具体类型,知道类型还不够,当然还需要知道这个类型所对应具体的值). 序列化时的权...

    caozhijian 评论0 收藏0
  • golang实现php里的serialize()和unserialize()序列和反序列方法

    摘要:实现里的安装用法世界上最好的语言世界上最好的语言世界上最好的语言地址 Golang 实现 PHP里的 serialize() 、 unserialize() 安装 go get -u github.com/techoner/gophp 用法 package main import ( fmt github.com/techoner/gophp/serialize )...

    TwIStOy 评论0 收藏0
  • php中的会话机制(2)

    摘要:会话机制如果是基于的会话机制,在调用之前,是不能够有任何实际的输出的,即使是空格或者是空行因为函数调用的时候,其实是通过函数向中设置了这个,对应的是一个随机的唯一的位字符串而前面是不可以有任何实际的输出的注意这里的名字是在文件中进行的配置配 session 会话机制: 1)如果是基于cookie的会话机制,在调用session_start()之前,是不能够有任何实际的输出的,即使是空...

    ConardLi 评论0 收藏0
  • Laravel 5.5 升级到 5.5.42 后遇到的 Cookie 列化问题

    摘要:查阅官方文档后得知,新版为了防止对象的序列化反序列化漏洞被利用,不再对值进行自动的序列化和反序列化处理。举个栗子更新到后,因为不再自动对值进行序列化处理,而只能加密字符串数据,这个时候程序就会抛出错误。 最近手残升级了项目里 Laravel 的小版本号(v5.5.39 => v5.5.45),这不升级则已,一升级就出了问题! Sentry 平台上提示错误:openssl_encrypt...

    jollywing 评论0 收藏0
  • java列化和反列化

    摘要:引语平时我们在运行程序的时候创建的对象都在内存中当程序停止或者中断了对象也就不复存在了如果我们能将对象保存起来在需要使用它的时候在拿出来使用就好了并且对象的信息要和我们保存时的信息一致序列化就可以解决了这样的问题序列化当然不止一种方式如下序 引语:     平时我们在运行程序的时候,创建的对象都在内存中,当程序停止或者中断了,对象也就不复存在了.如果我们能将对象保存起来,在需要使用它的...

    snowell 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<