動態插件功能的執行,允許加載的文件和功能,可以執行任何它想做,但是它只能接受和返回變量可以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