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