2012-04-05 88 views
3

我想做类似tryruby.org的东西。 我从用户(例如echo __FILE__)取出一行,然后我想在PHP中执行它并将输出返回给客户端。嵌入式PHP(命令行)

我试图做exec('php -r ' . $command, $output),但$output总是包含php的帮助部分。

任何人都可以帮助我或给出一个建议如何实现此功能。

Thx很多。

+0

试试'exec(“php -r \”$ command \“”,$ output)'。 BUt在任何情况下,它太危险,使用户可以在你的机器上运行命令 – safarov 2012-04-05 08:45:11

+0

看看'eval' http://php.net/manual/en/function.eval.php,但我不会建议只是把任何东西用户在那里。你会希望事先严格筛选出来。 – Nick 2012-04-05 08:46:09

+2

更好的是,看看['Runkit_Sandbox'](http://de2.php.net/manual/en/runkit.sandbox.php)。 – vstm 2012-04-05 08:48:06

回答

5

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

事实上,如果您坚持使用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

0

查看'eval()',更重要的是,为什么eval()和你想要做的事很难以安全的方式实现。成像,例如,用户输入谁:

echo file_get_contents('/etc/passwd'); 

你需要相当多的工作,使这个安全,包括鲸和过滤所有的系统调用从eval'd工艺制成。

干杯

7

为了php -r你必须得把你想要' ..你的代码之间执行代码.. '

例子:

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

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

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

另一部分是交互式shell的web界面。对于这一部分,我建议你看看repl.it,它提供了许多语言的服务(但可惜不是PHP)。 Here's a link它的源代码。

有了这个组合,你应该可以完成cour项目。