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
广告