lyte/serial

PHP序列化数组和标量类型的安全反序列化工具。

0.1.0 2018-06-25 06:47 UTC

README

Build Status Coverage Status

使用纯PHP进行PHP序列化字符串数组和标量类型的反序列化。

用法

使用composer安装

composer require lyte/serial

序列

Serial 是一个简化接口,旨在在遗留代码库中良好工作。

加载命名空间

use Lyte\Serial\Serial;
// unserialize statically
$unserialized = Serial::unserialize($someSerializedString);
// or with an instance
$serial = new Serial;
$unserialized = $serial->unserialize($someSerializedString);

// check if a string appears to be serialized
if (Serial::isSerialized($someUnknownString)) {
	$unserialized = Serial::unserialize($someUnknownString);
}

// or rely on exceptions
try {
	$unserialized = Serial::unserialize($someUnknownString);
} catch (\Exception $e) {
	// ...
}

反序列化器

Unserializer 是内部的工作马。

use Lyte\Serial\Unserializer;
$serial = new Unserializer($someSerializedString);
$unserialized = $serial->unserialize();

为什么?

PHP中的标准 serialize()unserialize() 调用即使使用PHP 7中的 $allowed_classes 过滤器也已被认为是危险的(存在内存损坏漏洞)。

对此问题的标准答案是“使用JSON”,但一些应用程序在JSON流行之前就已经使用PHP序列化字符串进行内部存储了(嗯,流行)。

在这种情况下,可能需要一个更安全的解析器,它拒绝任何不是数组或标量类型的东西(即您可以安全存储在JSON中的内容),作为中间方案来加固代码库,而无需立即更换底层存储格式。

注意:我并不主张让任何可以由用户修改的字符串被反序列化,只是如果您使用了一个更安全的解析器,并且有人攻击了您应用程序的另一个部分,这 可能 至少会让他们减速。

为什么我不能使用 $allowed_classes

PHP 7 为 unserialize() 函数添加了 $allowed_classes 选项。

理论上您可以将其设置为 null(或一组安全的类),但遗憾的是 存在内存损坏漏洞,这意味着如果您依赖这种行为,您 确实是 易受攻击的。