Unserialize 函数引入过滤器

通常我们使用 serialize 和 unserialize 两个方法分别对对象进行序列化和反序列化。然而 unserialize并不安全,因为它没有任何过滤项,可以反序列化任何对象。PHP7中unserialize函数引入了过滤器,这个特性旨在提供更安全的方式解包不可靠的数据。它通过白名单的方式来防止潜在的代码注入。默认情况下运行反序列化所有类型的对象。使用代码示例如下:

<?php
$foo = new stdClass();
$foo->name = 'revin';
$foo = serialize($foo);

// 将所有的对象都转换为 __PHP_Incomplete_Class 对象
$data = unserialize($foo, ["allowed_classes" => false]);
echo $data->name;  // 空
//var_dump($data);

// 将除 MyClass 和 MyClass2 之外的所有对象都转换为 __PHP_Incomplete_Class 对象
$data = unserialize($foo, ["allowed_classes" => ["MyClass", "MyClass2", "stdClass"]]);
//var_dump($data);
echo $data->name; //输出 "revin"

// 默认情况下所有的类都是可接受的,等同于省略第二个参数
$data = unserialize($foo, ["allowed_classes" => true]);
//var_dump($data);
echo $data->name; //输出 "revin"

Last updated