brumannpolyfill-unserialize

将PHP 7.0中引入的unserialize选项向后移植到旧版本的PHP。

v2.0.0 2020-07-24 10:16 UTC

This package is auto-updated.

Last update: 2024-08-24 20:41:52 UTC


README

将PHP 7.0中引入的unserialize选项向后移植到旧版本的PHP。最初这是为Symfony Issue #21090 设计的一个概念验证。

您可以在依赖PHP 7.0以下版本的项目中使用此包。如果您使用的是PHP 7.0+,则将使用原始的unserialize()

来自文档

警告

不要将不受信任的用户输入传递给unserialize(),无论allowed_classes的选项值如何。反序列化可能会导致代码被加载和执行,因为对象实例化和自动加载,恶意用户可能能够利用这一点。如果您需要将序列化数据传递给用户,请使用安全的、标准的数据交换格式,例如JSON(通过json_decode()和json_encode())。

要求

  • PHP 5.3+

安装

您可以通过composer安装此包

composer require brumann/polyfill-unserialize "^2.0"

旧版本

您可以在具有相同名称的分支中找到最新的1.x版本

升级

从1.x升级到2.0应该是无缝的,并且不需要修改使用此库的代码。公共API没有变化,即类、方法和参数的名称以及参数顺序和类型保持不变。2.x版本使用完全不同的方法来替换不允许的类,因此我们选择使用新的主要版本,以防止在现有安装中由于未知副作用而产生问题。

已知问题

$options中的allowed_classes不是正确的类型(数组或布尔值)时,行为不匹配。PHP 7.0不会发出警告,即提供了无效的类型。此库将触发一个警告,类似于PHP 7.1+将引发的警告,然后继续,假定false以确保不会意外地反序列化任何类。

测试

您可以使用PHPUnit运行测试套件。故意不将其捆绑为开发依赖项,以确保此包对实现系统的限制尽可能低。

请阅读PHPUnit手册以获取有关如何在您的系统上安装它的信息。

请确保选择兼容的版本。如果您使用PHP 5.6,应使用PHPUnit 5.7.27,对于较旧的PHP版本,应使用PHPUnit 4.8.36。较旧的PHPUnit版本可能不支持命名空间,这意味着它们将无法与测试一起使用。较新版本仅支持PHP 7.0+,在此库不再需要。

您可以按如下方式运行测试套件

phpunit -c phpunit.xml.dist tests/

贡献

此包被认为是功能完整的。因此,除非有安全问题,否则我可能不会更新它。

如果您发现任何错误或有问题,请随时在GitHub上提交问题或拉取请求。

开发设置

此库包含用于开发目的的docker设置。这允许在不需要本地安装的情况下在较旧的PHP版本上运行代码。

您可以使用以下方式使用此设置

  1. 进入项目目录

  2. 构建docker镜像

    docker build -t polyfill-unserialize .
    

    这将下载一个已安装PHP 5.6的debian/jessie容器。然后,它将下载适用于此PHP版本的相应版本的phpunit。它还将下载composer。它将工作目录设置为/opt/app。生成的镜像被标记为polyfill-unserialize,这是我们在运行容器时将引用的名称。

  3. 然后,您可以根据该镜像运行一个容器,该容器将运行您的测试

    docker run -it --rm --name polyfill-unserialize-dev -v "$PWD":/opt/app polyfill-unserialize
    

    这将基于我们之前构建的镜像运行一个Docker容器。在phpunit完成后,容器将被自动删除。我们将镜像命名为polyfill-unserialize-dev。这确保只有一个实例正在运行,并且我们可以通过名称轻松识别一个正在运行的容器,例如,为了手动删除它。我们将当前目录挂载到容器的当前工作目录。这确保测试在当前项目状态上运行。

您可以反复执行最后一步,以运行测试。输出应类似于以下内容

dbr:polyfill-unserialize/ (improvement/dev_setup*) $ docker run -it --rm --name polyfill-unserialize-dev -v "$PWD":/opt/app polyfill-unserialize
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Nothing to install or update
Generating autoload files
PHPUnit 5.7.27 by Sebastian Bergmann and contributors.

......................                                            22 / 22 (100%)

Time: 167 ms, Memory: 13.25MB

OK (22 tests, 31 assertions)

当您完成项目的开发后,可以通过删除最初构建的镜像来释放磁盘空间

docker image rm polyfill-unserialize