【问题标题】:Inline PHP (command line)内联 PHP(命令行)
【发布时间】:2012-04-19 00:01:02
【问题描述】:

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

我尝试使用exec('php -r ' . $command, $output),但$output 始终包含 PHP 帮助部分。

如何实现此功能?

【问题讨论】:

  • 试试exec("php -r \"$command\"", $output)。但是无论如何它太危险了,让用户可以在你的机器上运行命令
  • 看看eval php.net/manual/en/function.eval.php 但我不建议把用户的任何东西放在那里。您可能希望事先对其进行大量过滤。
  • 更好的是,看看Runkit_Sandbox
  • 这将是用户允许输入的命令的具体列表

标签: php shell terminal command-line-interface interpreter


【解决方案1】:

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

事实上,如果你坚持使用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 编码,see this

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      要创建php -r,您必须将要执行的代码放在' .. 你的代码.. ' 之间

      例子:

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

      【讨论】:

        【解决方案4】:

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

        echo file_get_contents('/etc/passwd');
        

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

        干杯

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-07-27
          • 1970-01-01
          • 1970-01-01
          • 2012-01-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多