📜  PHP 7-过滤的unserialize()(1)

📅  最后修改于: 2023-12-03 15:03:34.293000             🧑  作者: Mango

PHP 7 - 过滤的 unserialize()

简介

在 PHP 7 中,引入了一个新的特性,即对 unserialize() 函数进行了过滤,以减少安全风险和提高代码的可靠性。这个特性使得在执行 unserialize() 函数时,可以对输入的数据进行过滤和验证,防止恶意代码的注入与执行。

如何使用

在 PHP 7 中,调用 unserialize() 函数时,可以传递一个选项数组作为第二个参数,用于指定过滤和验证的规则。选项数组可以包含以下键值对:

  • allowed_classes:一个类名或类名数组,用于指定允许被反序列化的类。如果传入一个空数组,则禁止反序列化任何类。默认情况下,允许反序列化所有类。

  • denied_classes:一个类名或类名数组,用于指定禁止被反序列化的类。如果传入一个空数组,则允许反序列化任何类。默认情况下,不禁止反序列化任何类。

  • allowed_protocols:一个协议名或协议名数组,用于指定允许反序列化的协议。如果传入一个空数组,则禁止反序列化任何协议。默认情况下,允许反序列化所有协议。

  • denied_protocols:一个协议名或协议名数组,用于指定禁止反序列化的协议。如果传入一个空数组,则允许反序列化任何协议。默认情况下,不禁止反序列化任何协议。

示例

下面是一个示例代码片段,展示了如何使用 unserialize() 函数的过滤选项:

<?php
$data = 'O:5:"User":2:{s:8:"username";s:6:"guest";s:8:"password";s:6:"secret";}';

// 定义一个 User 类
class User {
    public $username;
    public $password;
}

// 反序列化前进行过滤
$filteredData = unserialize($data, [
    'allowed_classes' => ['User'],
]);

// 输出反序列化后的对象
var_dump($filteredData);
?>

在上述代码中,我们定义了一个 User 类,并将一个包含用户信息的序列化字符串 $data 传递给 unserialize() 函数。通过设置过滤选项数组中的 allowed_classes 键,我们只允许反序列化 User 类。最后,我们输出了反序列化后的对象,只包含 User 类的属性。

注意事项
  • 过滤选项仅在调用 unserialize() 函数时生效,如果在其他上下文中使用反序列化功能,需要自行进行过滤与验证。

  • 过滤选项只对传入的数据进行过滤与验证,不会对对象中的属性进行过滤。因此,在使用反序列化后的对象之前,仍然需要进行属性的验证与过滤。

  • 过滤选项仅适用于 PHP 7 及以上版本,在旧版本的 PHP 中无效。

总结

PHP 7 中的过滤的 unserialize() 特性使得反序列化过程更加安全可靠。通过对传入数据进行过滤与验证,可以有效地防止恶意代码的注入与执行。在进行序列化与反序列化操作时,建议使用过滤选项来提高代码的安全性。