我想做类似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 代码。因此不鼓励使用它。如果您已仔细验证除了使用此构造之外别无选择,请特别注意不要将任何用户提供的数据传入其中,而无需事先正确验证。
由于您想返回 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 编码,请参阅此。
http://tryruby.org似乎有一个交互式 Ruby shell。这似乎是一个很好的起点。
下面是两个为 PHP 提供这种外壳的项目:php_repl和phpsh。
另一部分是交互式 shell 的 Web 界面。对于这部分,我建议您看一下repl.it,它为多种语言提供此服务(但遗憾的是不是 PHP)。这是它的源代码的链接。
通过这种组合,您应该能够完成我们的项目。
查找“eval()”,更重要的是,为什么 eval() 以及您尝试做的事情很难以安全的方式实现。例如,对输入的用户进行成像:
echo file_get_contents('/etc/passwd');
您需要做很多工作才能确保安全,包括监视和过滤从 eval'd 进程进行的所有系统调用。
干杯