psx/sandbox

PHP 沙箱,用于执行 PHP 编程语言的安全子集

v0.6.0 2024-09-10 18:52 UTC

This package is auto-updated.

Last update: 2024-09-10 18:53:36 UTC


README

关于

这个库可以帮助执行由用户提供的 PHP 代码。例如,如果您的应用程序想要提供一个脚本功能,用户可以提供自定义的 PHP 代码。这个库可以帮助解析这些不受信任的代码,并且只有在存在安全调用时才会执行它们。

内部库使用 PHPParser 库来解析代码。为了使代码安全,沙箱只允许 PHP 的一小部分。无法定义类、接口或特性。此外,所有产生输出的函数(例如 echo、print 等)都不允许。用户唯一返回值的方式是通过在脚本中使用 return 语句。每个函数和新的调用都会被安全经理检查。安全经理包含所有允许的函数和类的白名单。

需要注意的是,安全检查不是在运行时执行的,我们只是简单地防止生成包含不受信任代码的 PHP 代码。因此,例如动态函数名 $func = 'foo'; $func(); 这样的特性也是不允许的。

如果代码是干净的,运行时将生成正常的 PHP 代码并将其写入文件。所有后续调用只是简单地包含并执行此代码,因此沙箱几乎没有性能损失。

安全性

不推荐在互联网上运行匿名用户的 PHP 代码。这个特性旨在由 SAAS 解决方案的客户使用,他们需要定制应用程序的特定部分。如果您找到了突破沙箱的方法,请提出问题;如果您愿意,也可以创建一个带有合适测试用例的拉取请求。请查看测试文件夹以查看已覆盖的案例。

用法

<?php

$code = <<<'CODE'
<?php

return [
    'result' => $my_service,
];

CODE;

$runtime = new \PSX\Sandbox\Runtime('my_code');
$runtime->set('my_service', 'foo');
$response = $runtime->run($code);

高级配置

通过传递 \PSX\Sandbox\SecurityManagerConfiguration 实例来设置配置

<?php

$config = new \PSX\Sandbox\SecurityManagerConfiguration( 
    preventGlobalNameSpacePollution: true
);
$securityManager = new \PSX\Sandbox\SecurityManager($securityManagerConfig);
$parser = new \PSX\Sandbox\Parser($securityManager);
        
$runtime = new \PSX\Sandbox\Runtime('my_code', $parser);
$runtime->set('my_service', 'foo');
$response = $runtime->run( '<php? return $my_service;' );
  • preventGlobalNameSpacePollution (bool): 将防止在全局命名空间中创建函数和常量。
  • allowedNamespace (null|string): 限制任何命名空间代码与值相同或为其子命名空间。

需求

  • PHP 8.0+

安装

使用 composer 安装 composer require psx/sandbox