摘要:和函數(shù)這兩個(gè)是序列化和反序列化中數(shù)據(jù)的常用函數(shù)。序列化數(shù)組輸出結(jié)果反序列化輸出結(jié)果當(dāng)數(shù)組值包含如雙引號單引號或冒號等字符時(shí),它們被反序列化后,可能會(huì)出現(xiàn)問題。序列化反序列化但是編碼將增加字符串的長度。序列化數(shù)組輸出結(jié)果反序列化
序列化是將變量轉(zhuǎn)換為可保存或傳輸?shù)淖址倪^程;反序列化就是在適當(dāng)?shù)臅r(shí)候把這個(gè)字符串再轉(zhuǎn)化成原來的變量使用。這兩個(gè)過程結(jié)合起來,可以輕松地存儲(chǔ)和傳輸數(shù)據(jù),使程序更具維護(hù)性。
serialize和unserialize函數(shù)
這兩個(gè)是序列化和反序列化PHP中數(shù)據(jù)的常用函數(shù)。
$a = array("a" => "Apple" ,"b" => "banana" , "c" => "Coconut");
//序列化數(shù)組
$s = serialize($a);
echo $s;
//輸出結(jié)果: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);
//輸出結(jié)果 Array ( [a] => Apple [b] => banana [c] => Coconut )
?>
當(dāng)數(shù)組值包含如雙引號、單引號或冒號等字符時(shí),它們被反序列化后,可能會(huì)出現(xiàn)問題。為了克服這個(gè)問題,一個(gè)巧妙的技巧是使用base64_encode和base64_decode。
$obj = array();
//序列化
$s = base64_encode(serialize($obj));
//反序列化
$original = unserialize(base64_decode($s));
但是base64編碼將增加字符串的長度。為了克服這個(gè)問題,可以和gzcompress一起使用。
//定義一個(gè)用來序列化對象的函數(shù)
**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格式序列化和反序列化是一個(gè)不錯(cuò)的選擇:
使用json_encode和json_decode格式輸出要serialize和unserialize格式快得多。
JSON格式是可讀的。
JSON格式比serialize返回?cái)?shù)據(jù)結(jié)果小。
JSON格式是開放的、可移植的。其他語言也可以使用它。
$a = array("a" => "Apple" ,"b" => "banana" , "c" => "Coconut");
//序列化數(shù)組
$s = json_encode($a);
echo $s;
//輸出結(jié)果:{"a":"Apple","b":"banana","c":"Coconut"}
echo "
";
//反序列化
$o = json_decode($s);
在上面的例子中,json_encode輸出長度比上個(gè)例子中serialize輸出長度顯然要短。
var_export 和 eval
var_export 函數(shù)把變量作為一個(gè)字符串輸出;eval把字符串當(dāng)成PHP代碼來執(zhí)行,反序列化得到最初變量的內(nèi)容。
$a = array("a" => "Apple" ,"b" => "banana" , "c" => "Coconut");
//序列化數(shù)組
$s = var_export($a , true);
echo $s;
//輸出結(jié)果: array ( "a" => "Apple", "b" => "banana", "c" => "Coconut", )
echo "
";
//反序列化
eval("$my_var=" . $s . ";");
print_r($my_var);
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/22727.html
0.前言 本文為篤行日常學(xué)習(xí)記錄,web安全php漏洞系列。 對象的序列化和反序列化作用就不再贅述,php中序列化的結(jié)果是一個(gè)php自定義的字符串格式,有點(diǎn)類似json. 我們在任何語言中設(shè)計(jì)對象的序列化和反序列化都需要解決幾個(gè)問題 把某個(gè)對象序列化之后,序列化的結(jié)果有自描述的功能(從序列化的結(jié)果中知道這個(gè)對象的具體類型,知道類型還不夠,當(dāng)然還需要知道這個(gè)類型所對應(yīng)具體的值). 序列化時(shí)的權(quán)...
摘要:實(shí)現(xiàn)里的安裝用法世界上最好的語言世界上最好的語言世界上最好的語言地址 Golang 實(shí)現(xiàn) PHP里的 serialize() 、 unserialize() 安裝 go get -u github.com/techoner/gophp 用法 package main import ( fmt github.com/techoner/gophp/serialize )...
摘要:會(huì)話機(jī)制如果是基于的會(huì)話機(jī)制,在調(diào)用之前,是不能夠有任何實(shí)際的輸出的,即使是空格或者是空行因?yàn)楹瘮?shù)調(diào)用的時(shí)候,其實(shí)是通過函數(shù)向中設(shè)置了這個(gè),對應(yīng)的是一個(gè)隨機(jī)的唯一的位字符串而前面是不可以有任何實(shí)際的輸出的注意這里的名字是在文件中進(jìn)行的配置配 session 會(huì)話機(jī)制: 1)如果是基于cookie的會(huì)話機(jī)制,在調(diào)用session_start()之前,是不能夠有任何實(shí)際的輸出的,即使是空...
摘要:查閱官方文檔后得知,新版為了防止對象的序列化反序列化漏洞被利用,不再對值進(jìn)行自動(dòng)的序列化和反序列化處理。舉個(gè)栗子更新到后,因?yàn)椴辉僮詣?dòng)對值進(jìn)行序列化處理,而只能加密字符串?dāng)?shù)據(jù),這個(gè)時(shí)候程序就會(huì)拋出錯(cuò)誤。 最近手殘升級了項(xiàng)目里 Laravel 的小版本號(v5.5.39 => v5.5.45),這不升級則已,一升級就出了問題! Sentry 平臺(tái)上提示錯(cuò)誤:openssl_encrypt...
摘要:引語平時(shí)我們在運(yùn)行程序的時(shí)候創(chuàng)建的對象都在內(nèi)存中當(dāng)程序停止或者中斷了對象也就不復(fù)存在了如果我們能將對象保存起來在需要使用它的時(shí)候在拿出來使用就好了并且對象的信息要和我們保存時(shí)的信息一致序列化就可以解決了這樣的問題序列化當(dāng)然不止一種方式如下序 引語: ????平時(shí)我們在運(yùn)行程序的時(shí)候,創(chuàng)建的對象都在內(nèi)存中,當(dāng)程序停止或者中斷了,對象也就不復(fù)存在了.如果我們能將對象保存起來,在需要使用它的...
閱讀 801·2023-04-26 00:30
閱讀 2711·2021-11-23 09:51
閱讀 1057·2021-11-02 14:38
閱讀 2608·2021-09-07 10:23
閱讀 2255·2021-08-21 14:09
閱讀 1398·2019-08-30 10:57
閱讀 1612·2019-08-29 11:20
閱讀 1161·2019-08-26 13:53