lyte / serial
PHP序列化数组和标量类型的安全反序列化工具。
0.1.0
2018-06-25 06:47 UTC
Requires
- php: >=5.4
Requires (Dev)
This package is not auto-updated.
Last update: 2024-09-29 03:20:41 UTC
README
使用纯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
(或一组安全的类),但遗憾的是 存在内存损坏漏洞,这意味着如果您依赖这种行为,您 确实是 易受攻击的。