动态插件功能的执行,允许加载的文件和功能,可以执行任何它想做,但是它只能接受和返回变量可以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 ...
应用所需的任何权限限制。
关于runkit;它似乎不是通过描述很好的沙盒,或者我应该说容易。 你可以禁止函数,但我宁愿禁止除提供列表中的所有函数。如果用户需要功能,我可以根据要求手动评估其安全性。 这似乎是唯一的方法是写一个自定义的解释器。如果速度是一个问题,你可以把它转换成PHP或其他语言,这实际上是我现在要做的,因为我找不到现成的解决方案。 干杯! Ps。是的,我看到这个Q很老了。 DS。 – Frank 2010-06-14 15:38:55
好吧..祝你好运,找到可以解析PHP到AST的东西;)我同意你的观点。 – troelskn 2010-06-14 17:27:57
FYI runkit似乎被放弃了,如果您想在现代版本的PHP上运行它,您可能需要编译CVS版本或其中一个修补版本(http://github.com/tricky/runkit) – Eli 2010-07-21 14:21:57