内联 PHP(命令行)

17

我想制作类似于 tryruby.org 的东西。我从用户那里得到一行输入(例如,echo __FILE__),我想在PHP中执行它,并将输出返回给客户端。

我尝试使用 exec('php -r ' . $command, $output),但 $output 总是包含PHP帮助部分。

如何实现这个功能?


尝试使用 exec("php -r \"$command\"", $output)。但无论如何,让用户在您的机器上运行命令都太危险了。 - safarov
看一下 eval http://php.net/manual/en/function.eval.php 但我不建议直接将用户输入的任何内容放在其中。您需要事先对其进行严格过滤。 - Nick
2
最好还是看一下Runkit_Sandbox - vstm
它将是用户被允许输入的具体命令列表。 - balkon_smoke
4个回答

29
为了使用 php -r 命令,你需要在 '' 之间放置想要执行的代码。

例如:

php -r ' $var = 34; print_r($var); '

7

看起来你的问题是没有用 ' ' 包裹要执行的代码。你还需要注意代码中的 ',特殊字符,转义序列等。

实际上,如果你坚持使用 exec(),最好这样做(完全避免担心转义和类似的问题):

$command = base64_encode($command);
exec("php -r 'eval(base64_decode(\"$command\"));'", $output);

你可以使用eval()代替你上面发布的内容。
这里的主要问题(包括eval()和你的exec()代码)是从用户输入中获取PHP代码根本不安全

eval()语言结构非常危险,因为它允许执行任意的PHP代码。因此建议不要使用。如果您已经仔细验证,没有其他选择,只能使用此结构,请特别注意不要在没有适当验证之前将任何用户提供的数据传递给它

建议

由于您想返回PHP代码的结果,您可以通过Ajax做一些很酷的事情,其中您可以将PHP代码作为参数传递给脚本(可能是Base64编码):
$code = base64_decode($_GET['code']);
// Clean the user input here
eval($code);

使用jQuery的Ajax示例:
// assuming `code` contains the PHP code
var encoded = base64_enc(code);

$.get('execute.php?code=' + encoded, function(data) {
    var result = new String(data);
    // do something with the result here, such as displaying it
}, dataType='text');

在JavaScript中进行Base64编码,请看这里

1

http://tryruby.org 看起来有一个交互式的 Ruby shell。那似乎是一个很好的起点。

这里有两个项目为 PHP 提供了这样的 shell:php_replphpsh

另一部分是交互式 shell 的 Web 接口。对于这部分,我建议您看看 repl.it,它为许多语言提供此服务(但不幸的是不包括 PHP)。这是一个链接到它的源代码。

通过这种组合,您应该能够完成您的项目。


-1

查找 'eval()',更重要的是,为什么使用 eval() 以及您尝试完成的任务在安全方面非常难以实现。例如,想象一下输入以下内容的用户:

echo file_get_contents('/etc/passwd');

你需要做很多工作来确保安全,包括监视和过滤从 eval 进程中发出的所有系统调用。

祝好


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接