PHP – 过滤的 unserialize()


在 PHP 中,内置函数 unserialize() 从 PHP 版本 4 开始可用。在 PHP 7 中,添加了传递允许的类列表的条款。这允许筛选出不受信任的源。unserialze() 函数仅从受信任的类中反序列化数据。

在 PHP 中,序列化意味着生成值的可存储表示形式。这对于存储或传递 PHP 值而不丢失它们的类型和结构很有用。内置的 serialize() 函数用于此目的。

serialize(mixed $value):string

unserialze() 函数从序列化表示中给出一个 PHP 值。从 PHP 7 开始,unserialize() 函数遵循以下格式 -

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

$data 参数是要反序列化的序列化字符串。

新引入了 $options 参数。它是以下键的关联数组 -

名称 描述
allowed_classes 一个应该被接受的类名数组,

false 表示不接受任何类,

true 接受所有类。
省略此选项等同于将其定义为 true
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);

    //接受所有类的默认行为
    //第二个论点可以省略。
    //如果allowed_classes传递为false,unserialize会将所有对象转换为__PHP_Incomplement_Class对象
   $usob1 = unserialize($sob1 , ["allowed_classes" => true]);

   // 将所有对象转换为__PHP_Inflete_Class对象,MyClass和NewClass的对象除外
   $usob2 = unserialize($sob2 , ["allowed_classes" => ["MyClass", "NewClass"]]);

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

将产生以下输出 -

10
20