22

我想从 php 执行一个 php 脚本,它将使用不同的常量和已定义的不同版本的类。

是否有一个沙箱 php_module 我可以:

sandbox('script.php'); // run in a new php environment

代替

include('script.php'); // run in the same environment

还是proc_open()是唯一的选择?

PS:该脚本无法通过网络访问,因此 fopen(' http://host/script.php ') 不是一个选项。

4

7 回答 7

10

runkit ,但如果您不需要主进程和子进程之间的任何交互,您可能会发现只通过命令行调用脚本(使用shell_exec )更简单。

于 2008-11-27T22:23:14.850 回答
6

这是 GitHub 上的一门课程,在早期阶段可能会有所帮助,但看起来很有希望。

https://github.com/fregster/PHPSandbox

于 2011-07-02T10:35:36.760 回答
2

此外,您应该查看反引号运算符

$sOutput = `php script_to_run.php`;

这将允许您检查正在运行的脚本的输出。但是,请注意,脚本将以您拥有的权限运行,但您可以通过在 Linux 上使用 sudo 来规避这一点。

此方法还假定您已安装 PHP CLI,但并非总是如此。

于 2008-11-28T11:04:23.893 回答
2

Runkit_Sandbox- 你可以让它工作,它是一个 PHP 扩展。我会说要走的路。

但是您可能需要自己创建一个“沙箱”,例如通过重置您使用的超全局变量的全局变量状态。

class SandboxState
{
    private $members = array('_GET', '_POST');
    private $store = array();
    public function save() {
        foreach($members as $name) {
            $this->store[$name] = $$name;
            $$name = NULL;
        }
    }
    public function restore() {
        foreach($members as $name) {
            $$name = $this->store[$name];
            $this->store[$name] = NULL;
        }

    }
}

用法:

$state = new SanddboxState();
$state->save();

// compile your get/post request by setting the superglobals
$_POST['submit'] = 'submit';
...

// execute your script:
$exec = function() {
    include(func_get_arg(0)));
};
$exec('script.php');

// check the outcome.
...

// restore your own global state:
$state->restore();
于 2012-04-17T10:03:48.060 回答
2

动态插件函数执行,允许加载的文件和函数执行它想要的任何东西,但是它只能接受和返回可以json_encode'ed 的变量。

function proxyExternalFunction($fileName, $functionName, $args, $setupStatements = '') {
  $output = array();
  $command = $setupStatements.";include('".addslashes($fileName)."');echo json_encode(".$functionName."(";
  foreach ($args as $arg) {
    $command .= "json_decode('".json_encode($arg)."',true),";
  }
  if (count($args) > 0) {
    $command[strlen($command)-1] = ")";//end of $functionName
  }
  $command .= ");";//end of json_encode
  $command = "php -r ".escapeshellarg($command);

  exec($command, $output);
  $output = json_decode($output,true);
}

外部代码是完全沙盒的,您可以通过执行应用任何您想要的权限限制sudo -u restricedUser php -r ...

于 2015-09-09T21:03:38.937 回答
1

为此,我开发了一个 BSD 许可的沙箱类。它利用 PHPParser 库来分析沙盒代码,根据用户可配置的白名单和黑名单对其进行检查,并具有广泛的配置选项以及合理的默认设置。根据您的需要,您可以轻松地重新定义在沙盒代码中调用的类并将它们路由到不同的类。

该项目还包括一个沙盒工具包(仅在您的本地机器上使用!),可用于试验沙盒设置,以及完整的手册和 API 文档。

https://github.com/fieryprophet/php-sandbox

于 2013-03-04T05:18:28.573 回答
0

我知道它不是 100% 相关的主题,但可能对某人有用 n__n

function require_sandbox($__file,$__params=null,$__output=true) {

    /* original from http://stackoverflow.com/a/3850454/209797 */

    if($__params and is_array($__params))
     extract($__params);

    ob_start();
    $__returned=require $__file;
    $__contents=ob_get_contents();
    ob_end_clean();

    if($__output)
     echo $__contents;
    else
     return $__returned;

};
于 2013-01-12T04:33:29.257 回答