在浏览器中模拟PHP的CLI

时间:2012-07-19 05:33:50

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

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

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

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

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

4 个答案:

答案 0 :(得分:2)

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

  • 将PHP代码写入文件夹(随机名称)中的文件(具有随机名称),单独执行,执行,然后在执行结束时删除。
  • 当前的PHP进程运行该文件中的代码。相反,它必须具有exec权限(safe_mode off)。 exec('php -c /path/to/security_tight/php.ini')(参见php - ?)
  • 抓住任何输出并将其发回浏览器。您可以免受任何奇怪的错误。而不是exec我推荐popen所以你可以杀死进程并手动控制等待它完成的超时(如果你杀了那个进程,你可以很容易地将错误发送回浏览器);

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

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

不要使用eval(),它不适合这种情况。攻击者可以跳转到您的应用程序并使用您当前的权限和变量对您说明。

答案 1 :(得分:1)

基本版本是

  1. 您脚本输出带有行输入的表单
  2. 表单操作指向您的脚本
  3. 脚本获取表单上的输入并将其传递给eval
  4. 将eval的任何输出传递给浏览器
  5. 再次输出表格
  6. 问题是,每个请求之间定义的函数和变量都会丢失。

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

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

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

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

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

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

    毋庸置疑,保护您的脚本免受滥用非常重要。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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

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