PHP - Filtered unserialize()

引言

你好!歡迎來到我們的PHP編程之旅。今天,我們將深入探討一個對初學者來說可能既令人興奮又有些令人生畏的主題:帶過濾器的 unserialize()。別擔心,我會一步一步地引導你,確保你沿路都能理解。

PHP - Filtered unserialize()

什麼是序列化?

在我們跳進 unserialize() 之前,讓我們先了解什麼是序列化。序列化是將對象或數據結構轉換為可以存儲或傳輸並在之後重構的格式。在PHP中,這通常使用 serialize() 函數來完成。

$data = array('a', 'b', 'c');
$serialized_data = serialize($data);
echo $serialized_data; // 輸出:a:3:{i:0;s:1:"a";i:1;s:1:"b";i:2;s:1:"c";}

在上述示例中,我們有一個數組 $data,它被序列化為一個字符串,使用 serialize()。生成的字符串然後可以存儲在數據庫中或通過網絡發送。

什麼是反序列化?

反序列化是序列化的逆過程。它將序列化的字符串轉換回其原始形式。在PHP中,這是使用 unserialize() 函數完成的。

$serialized_data = 'a:3:{i:0;s:1:"a";i:1;s:1:"b";i:2;s:1:"c";}';
$data = unserialize($serialized_data);
print_r($data); // 輸出:Array ( [0] => a [1] => b [2] => c )

在這個示例中,我們將序列化的字符串 $serialized_data 轉換回數組使用 unserialize()

過濾器是什麼?

現在,讓我們來談論過濾器。當你在處理反序列化的數據時,確保數據是安全且有效的非常重要。這就是過濾器的用武之地。過濾器允許你為反序列化過程指定附加規則。

PHP中有兩種主要的過濾器類型:

  1. 選項:這些用於控制 unserialize() 的行為。例如,你可以使用 UNSERIALIZE_THROW_ON_INVALID 選項來在無法反序列化數據時抛出異常。
  2. 回調:這些是用戶定義的函數,可以用於對反序列化的數據進行自定義驗證或轉換。

在 unserialize() 中使用過濾器

現在我們已經介紹了基本知識,讓我們看看如何與 unserialize() 使用過濾器。我們先從選項過濾器開始。

選項過濾器

UNSERIALIZE_OPTIONS 選項允許你指定附加標誌,這些標誌控制 unserialize() 的行為。以下是一個示例:

$serialized_data = 'a:3:{i:0;s:1:"a";i:1;s:1:"b";i:2;s:1:"c";}';
$options = ['options' => ['allowed_classes' => false]];
$data = unserialize($serialized_data, $options);

在這個示例中,我們將 allowed_classes 選項設置為 false,這意味著只有PHP的本地類別將被允許反序列化。如果序列化的數據包含任何其他類別,將會拋出錯誤。

回調過濾器

回調過濾器是一個更先進的功能,它允許你定義自己的驗證或轉換邏輯。以下是一個示例:

function my_callback($class, $data, $filter) {
if ($class === 'MyClass') {
return new MyClass($data);
}
return false;
}

$serialized_data = 'O:8:"MyClass":1:{s:4:"name";s:5:"Alice";}';
$data = unserialize($serialized_data, ['callback' => 'my_callback']);

在這個示例中,我們定義了一個回調函數 my_callback(),它檢查被反序列化的類別是否為 MyClass。如果是,它會使用提供的数据創建 MyClass 的新實例。如果不是,它會返回 false,這將導致 unserialize() 失敗。

結論

呼!這真是個刺激的旅程,不是嗎?我希望你現在對序列化、反序列化以及如何在PHP中使用 unserialize() 的過濾器有了更好的理解。記住,熟能生巧,所以請用一些樣本數據嘗試這些概念。並且不要忘了在過程中玩得開心!

Credits: Image by storyset