我想制作类似于 tryruby.org 的东西。我从用户那里得到一行输入(例如,echo __FILE__
),我想在PHP中执行它,并将输出返回给客户端。
我尝试使用 exec('php -r ' . $command, $output)
,但 $output
总是包含PHP帮助部分。
如何实现这个功能?
我想制作类似于 tryruby.org 的东西。我从用户那里得到一行输入(例如,echo __FILE__
),我想在PHP中执行它,并将输出返回给客户端。
我尝试使用 exec('php -r ' . $command, $output)
,但 $output
总是包含PHP帮助部分。
如何实现这个功能?
php -r
命令,你需要在 '
和 '
之间放置想要执行的代码。
例如:
php -r ' $var = 34; print_r($var); '
看起来你的问题是没有用 ' '
包裹要执行的代码。你还需要注意代码中的 '
,特殊字符,转义序列等。
实际上,如果你坚持使用 exec()
,最好这样做(完全避免担心转义和类似的问题):
$command = base64_encode($command);
exec("php -r 'eval(base64_decode(\"$command\"));'", $output);
eval()
代替你上面发布的内容。eval()
和你的exec()
代码)是从用户输入中获取PHP代码根本不安全:
eval()语言结构非常危险,因为它允许执行任意的PHP代码。因此建议不要使用。如果您已经仔细验证,没有其他选择,只能使用此结构,请特别注意不要在没有适当验证之前将任何用户提供的数据传递给它。
$code = base64_decode($_GET['code']);
// Clean the user input here
eval($code);
// 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');
http://tryruby.org 看起来有一个交互式的 Ruby shell。那似乎是一个很好的起点。
这里有两个项目为 PHP 提供了这样的 shell:php_repl 和 phpsh。
另一部分是交互式 shell 的 Web 接口。对于这部分,我建议您看看 repl.it,它为许多语言提供此服务(但不幸的是不包括 PHP)。这是一个链接到它的源代码。
通过这种组合,您应该能够完成您的项目。
查找 'eval()',更重要的是,为什么使用 eval() 以及您尝试完成的任务在安全方面非常难以实现。例如,想象一下输入以下内容的用户:
echo file_get_contents('/etc/passwd');
你需要做很多工作来确保安全,包括监视和过滤从 eval 进程中发出的所有系统调用。
祝好
exec("php -r \"$command\"", $output)
。但无论如何,让用户在您的机器上运行命令都太危险了。 - safaroveval
http://php.net/manual/en/function.eval.php 但我不建议直接将用户输入的任何内容放在其中。您需要事先对其进行严格过滤。 - NickRunkit_Sandbox
。 - vstm