8

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

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

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

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

4

4 回答 4

2

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

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

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

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

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

于 2012-07-24T15:07:40.980 回答
1

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

于 2012-07-28T10:06:59.080 回答
1

基本版本是

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

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

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

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

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

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

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

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

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

于 2012-07-21T23:17:39.737 回答
1

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

Mozilla 还有一个功能齐全的基于 Web 的 IDE,称为Bespin,它也是高度可扩展和可配置的。

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

于 2012-07-28T15:36:05.640 回答