xkerman/restricted-unserialize

提供 PHP 对象注入安全反序列化函数

1.1.12 2019-08-11 00:04 UTC

README

Build Status codecov Scrutinizer Code Quality Latest Stable Version

此 Composer 包提供 unserialize 函数,该函数对 PHP 对象注入 (POI) 安全。

如果您在 PHP 应用程序中用普通 unserialize 函数进行用户输入的反序列化

  1. 不要使用此包,使用 json_decode 以避免 PHP 对象注入
  2. 如果兼容性很重要,首先使用此函数,然后在不久的将来尝试使用 json_decode

为什么 POI 安全?

此包中的 unserialize 函数只反序列化布尔值、整数、浮点数、字符串和数组,不反序列化对象实例。由于任何具有 POP 链魔法方法(如 __destruct__toString)的实例都无法实例化,因此任何利用 POP 链的计划都会失败。(您可以阅读有关 POP 链的详细说明 https://www.insomniasec.com/downloads/publications/Practical%20PHP%20Object%20Injection.pdf

安装

$ composer require xkerman/restricted-unserialize

如何使用

如果您的 PHP 版本 > 5.5

require 'path/to/vendor/autoload.php';

use function xKerman\Restricted\unserialize;
use xKerman\Restricted\UnserializeFailedException;

try {
    var_dump(unserialize($data));
} catch (UnserializeFailedException $e) {
    echo 'failed to unserialize';
}

如果您的 PHP 版本 >= 5.3 且 <= 5.5

require 'path/to/vendor/autoload.php';

use xKerman\Restricted;
use xKerman\Restricted\UnserializeFailedException;

try {
    var_dump(Restricted\unserialize($data));
} catch (UnserializeFailedException $e) {
    echo 'failed to unserialize';
}

如果您的 PHP 版本是 5.2

require_once 'path/to/generated/src/xKerman/Restricted/bootstrap.php';

try {
    var_dump(xKerman_Restricted_unserialize($data));
} catch (xKerman_Restricted_UnserializeFailedException $e) {
    echo 'failed to unserialize';
}

相关其他包

mikegarde/unserialize-fix

mikegarde/unserialize-fix 包提供 \unserialize\fix 函数,该函数首先尝试使用 unserialize 函数。因此,该函数不是 POI 安全的。

academe/serializeparser

academe/serializeparser 包提供 \Academe\SerializeParser\Parser::parse 方法,这是 PHP 实现的 unserialize,但不反序列化对象实例。因此,该方法似乎是 POI 安全的,但没有测试。

jeroenvdheuve/serialization

jeroenvdheuve/serialization 包提供 \jvdh\Serialization\Unserializer\unserialize 方法,这也是 PHP 实现的 unserialize,并且不反序列化对象实例。因此,该方法似乎是 POI 安全的。该方法可以反序列化序列化的 PHP 引用,而此(xkerman/restricted-unserilize)包不能反序列化。通过使用 PHP 引用,我们可以创建循环结构,但这使得迁移到 json_decode 更困难,因为 JSON 不支持循环结构的解码/编码。

开发

要为 PHP 5.2 生成代码,请运行 composer run generate。生成的代码将保存在 generated/ 目录下。

许可证

MIT 许可证