psx / sandbox
PHP 沙箱,用于执行 PHP 编程语言的安全子集
v0.6.0
2024-09-10 18:52 UTC
Requires
- php: >=8.0
- nikic/php-parser: ^4.0|^5.0
Requires (Dev)
- phpunit/phpunit: ^9.0
- vimeo/psalm: ^5.0
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