10

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

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

如何实现此功能?

4

4 回答 4

20

为了使php -r您必须将要执行的代码放在'..您的代码..'

例子:

php -r ' $var = 34; print_r($var); '
于 2012-04-05T08:47:28.777 回答
6

看起来您的问题是您没有包装要执行的代码' '。您还需要警惕'代码中的特殊字符、转义序列等。

事实上,如果你坚持使用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 编码,请参阅此

于 2012-04-05T09:17:32.287 回答
1

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

下面是两个为 PHP 提供这种外壳的项目:php_replphpsh

另一部分是交互式 shell 的 Web 界面。对于这部分,我建议您看一下repl.it,它为多种语言提供此服务(但遗憾的是不是 PHP)。这是它的源代码的链接。

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

于 2012-04-05T08:52:59.630 回答
-1

查找“eval()”,更重要的是,为什么 eval() 以及您尝试做的事情很难以安全的方式实现。例如,对输入的用户进行成像:

echo file_get_contents('/etc/passwd');

您需要做很多工作才能确保安全,包括监视和过滤从 eval'd 进程进行的所有系统调用。

干杯

于 2012-04-05T08:45:20.890 回答