xkerman / restricted-unserialize
提供 PHP 对象注入安全反序列化函数
Requires
- php: >=5.2
Requires (Dev)
- nikic/php-parser: ^1.4|^3.0|^4.2
- phpmd/phpmd: ^2.6
- phpunit/phpunit: ^4.8|^5.7|^6.5|^7.4|^8.2
- sebastian/phpcpd: ^2.0|^3.0|^4.1
- squizlabs/php_codesniffer: ^2.9|^3.4
README
此 Composer 包提供 unserialize
函数,该函数对 PHP 对象注入 (POI) 安全。
如果您在 PHP 应用程序中用普通 unserialize
函数进行用户输入的反序列化
- 不要使用此包,使用
json_decode
以避免 PHP 对象注入 - 如果兼容性很重要,首先使用此函数,然后在不久的将来尝试使用
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 许可证