2008-11-27 122 views

回答

10

runkit,但是如果您不需要主进程和子进程之间的任何交互,则可以通过在命令行上调用脚本(使用shell_exec)更简单。

+2

关于runkit;它似乎不是通过描述很好的沙盒,或者我应该说容易。 你可以禁止函数,但我宁愿禁止除提供列表中的所有函数。如果用户需要功能,我可以根据要求手动评估其安全性。 这似乎是唯一的方法是写一个自定义的解释器。如果速度是一个问题,你可以把它转换成PHP或其他语言,这实际上是我现在要做的,因为我找不到现成的解决方案。 干杯! Ps。是的,我看到这个Q很老了。 DS。 – Frank 2010-06-14 15:38:55

+0

好吧..祝你好运,找到可以解析PHP到AST的东西;)我同意你的观点。 – troelskn 2010-06-14 17:27:57

+0

FYI runkit似乎被放弃了,如果您想在现代版本的PHP上运行它,您可能需要编译CVS版本或其中一个修补版本(http://github.com/tricky/runkit) – Eli 2010-07-21 14:21:57

2

此外,你应该看看backtick operator

$sOutput = `php script_to_run.php`; 

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

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

1

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(); 
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; 

}; 
1

我开发了一个基于BSD授权的沙箱类这很可能有用目的。它利用PHPParser库分析沙盒代码,根据用户可配置的白名单和黑名单对其进行检查,并提供各种配置选项以及理智的默认设置。为了您的需要,您可以轻松地重新定义在沙盒代码中调用的类并将它们路由到不同的类。

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

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

1

动态插件功能的执行,允许加载的文件和功能,可以执行任何它想做,但是它只能接受和返回变量可以json_encode“版。

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 ...应用所需的任何权限限制。

相关问题