【问题标题】:Emulating PHP's CLI in a browser在浏览器中模拟 PHP 的 CLI
【发布时间】:2012-07-18 06:19:54
【问题描述】:

我正在考虑基于浏览器的 PHP IDE 的想法,并对通过浏览器模拟命令行的可能性感到好奇,但我对 CLI 开发工具不够熟悉,无法知道它是否是可以轻松完成或根本完成。我想做更多的调查,但到目前为止还没有找到很多关于它的资源。

从高层次来看,我的第一直觉是设置一个文本输入,它将通过 AJAX 向 PHP 脚本提供命令并将任何输出返回到页面上。我只是对 CLI 不够熟悉,不知道如何在这种情况下与之交互。

我不需要实际的代码,虽然这也很有用,但我正在寻找更多我应该进一步研究的函数、类或 API。理想情况下,我更喜欢 PHP(假设是 PHP 5.3)而不是第三方库。你会如何解决这个问题?有什么我应该知道的资源或项目吗?

编辑:用例是本地主机或开发服务器,而不是面向公众的站点。

【问题讨论】:

  • REPL Environment for the Web 的可能重复项
  • @IgnacioVazquez-Abrams - 这不是重复的。我正在寻找自己的构建,而不是使用第 3 方工具。专门针对 PHP 的唯一答案是 phpsh,它是用 python 编写的,所以这实际上并不能帮助我用 PHP 构建它。
  • 如果有人执行unlink('/')怎么办?
  • viper-7s codepad 的代码可在 github 上找到。可能对你有用。

标签: php php-5.3 command-line-interface


【解决方案1】:

通过 RPC 或来自 javascript 的直接 POST 调用此函数,它按以下顺序执行操作:

  • 将 PHP 代码写入文件夹(具有随机名称)中的文件(具有随机名称),该文件将单独放置、执行,然后在执行结束时被删除。
  • 当前的 PHP 进程将不会运行该文件中的代码。相反,它必须具有执行权限(安全模式关闭)。 exec('php -c /path/to/security_tight/php.ini')(见 php -?)
  • 捕获任何输出并将其发送回浏览器。您可以避免任何奇怪的错误。而不是 exec 我推荐 popen 这样您就可以终止进程并手动控制等待它完成的超时时间(如果您终止该进程,您可以轻松地将错误发送回浏览器);

对于通过浏览器调用时运行的普通 PHP 进程,您需要宽松/正常的安全性(与整个 IDE 后端相同)。

对于运行临时脚本的 php.ini 和 php 进程,您需要严格和偏执的安全性(继续,甚至将其分离到另一台没有网络/互联网访问权限的机器上,并且每隔一小时将其状态恢复为出厂状态,只是为了确定)。

不要使用eval(),不适合这种场景。攻击者可以跳入您的应用程序并使用您当前的权限和变量状态来对付您。

【讨论】:

  • 在这种情况下,您将如何记住 PHP 变量的值?每个文件是否包含/执行内存中的所有控制台代码?另外,我不确定您提到的所有安全步骤是否都适用于我的用例。我正在考虑在本地主机或开发服务器上使用可下载的应用程序,而不是向公众开放的东西。
  • 可以通过赋值来设置变量。重新运行 PHP 文件会重新分配它们……它是否向公众开放并不会影响我的回答。您的问题没有提到“可下载的应用程序”,只有浏览器 CLI。此浏览器 CLI 要求仅暗示通过 Internet 进行的操作。无论如何,我的答案仍然可以在 localhost 上运行,您绑定的内容仍然不会影响答案的有效性。
  • 如果出现错误,您应该回滚到最后一行/命令之前。
  • 我还没有机会对此进行测试,但我认为它让我对如何处理它有了足够的了解,我可以让它发挥作用。谢谢。
  • 您可以将上述内容与while(true){include("part.php") ;sleep(1))} 结合使用(如果出现错误,您仍然必须回滚整个内容,这可能无法与不应重复的操作一起使用) - 当然include 将被调节。
【解决方案2】:

基本版本是

  1. 您的脚本输出带有行输入的表单
  2. 表单动作指向您的脚本
  3. 脚本接受表单上的输入并将其传递给 eval
  4. 将任何输出从 eval 传递到浏览器
  5. 再次输出表单

问题是,定义的函数和变量在每次请求之间都会丢失。

您是否可以将输入的每一行添加到您的会话中。让我们说

$inputline = $_GET['line'];
$_SESSION['script'] .= $inputline . PHP_EOL;
eval($_SESSION['script'];

这样,在每个会话中都会执行一个完整的 PHP 脚本(当然你会得到完整的输出)。

另一种选择是创建某种守护程序(基本上是php -a 调用的实例),在后台在服务器上运行,从浏览器获取输入并传递输出。

您可以将此守护程序连接到两个 FIFO 设备(一个用于输入,一个用于输出)并通过简单的fopen 进行通信。

对于每个使用您的脚本的用户,必须生成一个新的守护进程。

不用说,保护您的脚本免受滥用很重要。

【讨论】:

    【解决方案3】:

    最近我读到了一个用 Javascript php.js 编写的 PHP 解释器,因此您可以仅使用浏览器编写和执行 PHP 代码。我不确定这是否是你最终需要的,但听起来很有趣。

    【讨论】:

      【解决方案4】:

      我们在我的大学测试了一些产品,用于通过 ssh 访问我们的实验室服务器,并使用了一些 Web-SSH-Tools - 它们基本上完全符合您的要求。 Shell-In-A-Box-Project 可以绑定到您喜欢的任何解释器,如果需要,可以与交互式 php-interpreter 一起使用(在演示页面上,他们使用了基本解释器)。该项目可以作为真正 PHP-IDE 的基础。它们的优点是能够与任何基于控制台的编辑器(例如 vi、emacs 或 nano)进行交互,以及能够提供管理命令(例如创建文件夹、更改所有权或 ACL 或重新启动服务)。

      Mozilla 还有一个功能齐全的基于 Web 的 IDE,名为 Bespin,它也是 highly extensible and configurable

      正如您所说,该页面不面向公众,您当然必须使用身份验证和 SSL 保护该页面以对抗session hijacking

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-18
        • 1970-01-01
        • 1970-01-01
        • 2011-04-26
        • 1970-01-01
        • 2013-07-23
        • 2013-11-02
        • 2011-03-06
        相关资源
        最近更新 更多