PHP – 過濾後的 unserialize()



在 PHP 中,內建函式 unserialize() 從 PHP 4 版本開始可用。在 PHP 7 中,添加了傳遞允許類列表的規定。這允許過濾掉不受信任的來源。unserialize() 函式僅對來自受信任類的的資料進行反序列化。

在 PHP 中,序列化意味著生成值的可儲存表示形式。這對於儲存或傳遞 PHP 值而不丟失其型別和結構很有用。內建的 serialize() 函式用於此目的。

serialize(mixed $value): string

unserialize() 函式從序列化表示形式中獲取 PHP 值。從 PHP 7 開始,unserialize() 函式遵循以下格式:

unserialize(string $data, array $options = [ ]): mixed

$data 引數是要反序列化的序列化字串。

$options 引數是新引入的。它是以下鍵的關聯陣列:

序號 名稱和描述

1

allowed_classes

應接受的類名陣列,

false 表示不接受任何類,

true 表示接受所有類。

省略此選項與將其定義為 true 相同。

2

max_depth

反序列化期間允許的結構的最大深度。

示例

請檢視以下示例:

<?php
   class MyClass { 
      var int $x;
      function __construct(int $x) {
         $this->x = $x;
      }
   }
   class NewClass {
      var int $y;
      function __construct(int $y) {
         $this->y = $y;
      }
   }

   $obj1 = new MyClass(10);
   $obj2 = new NewClass(20);

   $sob1 = serialize($obj1);
   $sob2 = serialize($obj2);

   // default behaviour that accepts all classes
   // second argument can be ommited.
   // if allowed_classes is passed as false, unserialize converts all objects into __PHP_Incomplete_Class object
   $usob1 = unserialize($sob1 , ["allowed_classes" => true]);

   // converts all objects into __PHP_Incomplete_Class object except those of MyClass and NewClass
   $usob2 = unserialize($sob2 , ["allowed_classes" => ["MyClass", "NewClass"]]);

   echo $usob1->x . PHP_EOL;
   echo $usob2->y . PHP_EOL;
?>

它將生成以下輸出

10
20
廣告