我想做类似tryruby.org的东西。 我从用户(例如echo __FILE__
)取出一行,然后我想在PHP中执行它并将输出返回给客户端。嵌入式PHP(命令行)
我试图做exec('php -r ' . $command, $output)
,但$output
总是包含php的帮助部分。
任何人都可以帮助我或给出一个建议如何实现此功能。
Thx很多。
我想做类似tryruby.org的东西。 我从用户(例如echo __FILE__
)取出一行,然后我想在PHP中执行它并将输出返回给客户端。嵌入式PHP(命令行)
我试图做exec('php -r ' . $command, $output)
,但$output
总是包含php的帮助部分。
任何人都可以帮助我或给出一个建议如何实现此功能。
Thx很多。
它看起来像你的问题是,你没有包装你的代码与' '
执行。您还需要注意代码中的'
,特殊字符,转义序列等。
事实上,如果您坚持使用exec()
,那么最好不要这样做(为了完全避免担心转义而这样的):
$command = base64_encode($command);
exec("php -r 'eval(base64_decode(\"$command\"));'", $output);
您可能使用eval()
,而不是你在上面张贴什么。
这里(均与eval()
和你exec()
代码)的主要问题是,服用PHP代码从用户输入根本就没有安全的:
中的eval()语言结构是很危险,因为它允许执行任意PHP代码。因此不鼓励使用它。如果您已经认真核实没有其他选择而不是使用此构造,请特别注意不要将任何用户提供的数据放入其中,而不事先对其进行正确验证。
建议
由于要返回的PHP代码的结果,你可能会做一些很酷的东西与AJAX你通过PHP代码的脚本(base 64编码,或许)作为参数:
$code = base64_decode($_GET['code']);
// clean the user input here
eval($code);
AJAX实施例使用jQuery:
// 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中的base 64编码,see this。
查看'eval()',更重要的是,为什么eval()和你想要做的事很难以安全的方式实现。成像,例如,用户输入谁:
echo file_get_contents('/etc/passwd');
你需要相当多的工作,使这个安全,包括鲸和过滤所有的系统调用从eval'd工艺制成。
干杯
为了php -r
你必须得把你想要'
..你的代码之间执行代码.. '
例子:
php -r ' $var = 34; print_r($var); '
http://tryruby.org似乎有交互式Ruby shell。这似乎是一个很好的起点。
这里有两个项目为PHP提供了这样一个shell:php_repl和phpsh。
另一部分是交互式shell的web界面。对于这一部分,我建议你看看repl.it,它提供了许多语言的服务(但可惜不是PHP)。 Here's a link它的源代码。
有了这个组合,你应该可以完成cour项目。
试试'exec(“php -r \”$ command \“”,$ output)'。 BUt在任何情况下,它太危险,使用户可以在你的机器上运行命令 – safarov 2012-04-05 08:45:11
看看'eval' http://php.net/manual/en/function.eval.php,但我不会建议只是把任何东西用户在那里。你会希望事先严格筛选出来。 – Nick 2012-04-05 08:46:09
更好的是,看看['Runkit_Sandbox'](http://de2.php.net/manual/en/runkit.sandbox.php)。 – vstm 2012-04-05 08:48:06