本文目錄一覽:
請寫出php變量序列化和反序列化的函數,並舉出1個應用例子
PHP中的序列化和反序列化分別通過函數serialize()和unserialize()即可實現。serialize()的參數可以是resource類型外的所有變量類型,最常見的是用來序列化對象,unseialize()將serialize的返回結果作為參數,進行反序列化,得到原對象。$str = serialize ($obj);…$obj222 = unserialize($str);現在可以用$object222對象來執行該對象可以執行的各種操作。在用serialize序列化對象時,會自動調用__sleep方法,__sleep方法必須返回一個數組,包含需要串行化的屬性。 PHP會拋棄其它屬性的值, 如果沒有__sleep方法,PHP將保存所有屬性,包括private屬性。用unserialize反序列化對象時,PHP 會調用__wakeup方法。__sleep和__wakeup方法可以根據實際需要,都添加上,也可以只要其中的一個,當然也可以都不要。下面給出一個序列化的代碼:共serialize.php和unserialize.php兩個文件。// serialize.php?php
class User
{
private $name;
private $id;
public $sex=”F”;
function __construct()
{
//give user a unique ID 賦予一個不同的ID
$this-id = uniqid();
}
function __sleep()
{
//do not serialize this-id 不串行化id
return(array(“name”,”sex”));
}
function __wakeup()
{
//give user a unique ID
$this-id = uniqid();
}
function p(){
echo “in function p() \t”;
return $this-name;
}
function setname($name){
$this-name = $name;
}
} //create object 建立一個對象
$u = new User;
$u-setname(“pphu”);
//serialize it 串行化
$s = serialize($u);
echo “in serialize.php br/”;
print_r($s);
echo “br/”;
print_r($u);
echo “br/br/”;
? //// unserialize.php?php
include(‘serialize.php’);
//global $s;
$u2 = unserialize($s);
echo “in unserialize.phpbr/”;
echo $u2-p().”br/”;
echo $u2-sex.”br/”;
print_r($u2);
?
php如何循環反序列化?
1.構造HITCON類反序列化字符串,其中$method=’login’,$args數組』username』部分可用於構造SQL語句,進行SQL注入,’password』部分任意設置。
2.調用login()函數後,利用username構造聯合查詢,使查詢結果為SoFun類反序列化字符串,設置username構造聯合查詢,使查詢結果為SoFun類反序列化字符串,設置username構造聯合查詢,使查詢結果為SoFun類反序列化字符串,設置file=『flag.php』,需繞過__wakeup()函數。
3.繞過oadData()函數對反序列化字符串的驗證。
4.SoFun類 __destruct()函數調用後,包含flag.php文件,獲取flag,需繞過__wakeup()函數。
php中序列化與反序列化
把複雜的數據類型壓縮到一個字符串中
serialize() 把變量和它們的值編碼成文本形式
unserialize() 恢復原先變量
eg:
結果:a:3:{i:0;s:3:”Moe”;i:1;s:5:”Larry”;i:2;s:5:”Curly”;}
Array ( [0] = Moe [1] = Larry [2] = Curly )
當把這些序列化的數據放在URL中在頁面之間會傳遞時,需要對這些數據調用urlencode(),以確保在其中的URL元字符進行處理:
margic_quotes_gpc和magic_quotes_runtime配置項的設置會影響傳遞到unserialize()中的數據。
如果magic_quotes_gpc項是啟用的,那麼在URL、POST變量以及cookies中傳遞的數據在反序列化之前必須用stripslashes()進行處理:
如果magic_quotes_runtime是啟用的,那麼在向文件中寫入序列化的數據之前必須用addslashes()進行處理,而在讀取它們之前則必須用stripslashes()進行處理:
當對一個對象進行反序列化操作時,PHP會自動地調用其__wakeUp()方法。這樣就使得對象能夠重新建立起序列化時未能保留的各種狀態。例如:數據庫連接等。
php的序列化和反序列化有什麼好處
序列化是將變量轉換為可保存或傳輸的字符串的過程;反序列化就是在適當的時候把這個字符串再轉化成原來的變量使用。這兩個過程結合起來,可以輕鬆地存儲和傳輸數據,使程序更具維護性。
PHP中的序列化和反序列化分別通過函數serialize()和unserialize()即可實現。serialize()的參數可以是resource類型外的所有變量類型,最常見的是用來序列化對象,unseialize()將serialize的返回結果作為參數,進行反序列化,得到原對象。
在PHP中,序列化和反序列化很多地方都可以用到!~
例如:數據庫連接,序列化數組等等。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/285315.html