2012-07-19 19 views
8

Considero la idea de un IDE de PHP basado en navegador y tengo curiosidad acerca de la posibilidad de emular la línea de comandos a través del navegador, pero no estoy lo suficientemente familiarizado con el desarrollo de herramientas para la CLI para saber si es algo que podría hacerse fácilmente o en absoluto. Me gustaría investigar un poco más, pero hasta ahora no he podido encontrar muchos recursos en él.Emulación de la CLI de PHP en un navegador

Desde un nivel alto, mi primer instinto es configurar una entrada de texto que alimente comandos a un script PHP mediante AJAX y devuelva cualquier salida a la página. Simplemente no estoy lo suficientemente familiarizado con la CLI para saber cómo interactuar con ella en ese contexto.

No necesito el código real, aunque sería útil también, pero estoy buscando más funciones, clases o API que deba investigar más. Idealmente, preferiría algo cocido en PHP (asuma PHP 5.3) y no una biblioteca de terceros. ¿Cómo abordarías esto? ¿Hay algún recurso o proyecto que deba conocer?

Editar: El caso de uso para esto sería un localhost o servidor de desarrollo, no un sitio público.

+1

posible duplicado de [REPL Environment for the Web] (http://stackoverflow.com/questions/5918670/repl-environment-for-the-web) –

+0

@ IgnacioVazquez-Abrams - No es un duplicado. Estoy buscando construir el mío, no utilizar una herramienta de terceros. La única respuesta específica para PHP es phpsh, que está escrito en python, por lo que no me ayuda a compilarlo en PHP. – VirtuosiMedia

+0

¿Qué pasa si alguien ejecuta 'unlink ('/')'? –

Respuesta

2

llamar a esta función el canal una RPC o un POST directa de JavaScript, que hace las cosas en este orden:

  • escribir el código PHP en un archivo (con un nombre aleatorio) en una carpeta (con una muestra aleatoria nombre), donde se sentará solo, se ejecutará y luego se eliminará al final de la ejecución.
  • El proceso actual de PHP va a no ejecutar el código en ese archivo. En su lugar, debe tener permisos de ejecución (safe_mode off). exec('php -c /path/to/security_tight/php.ini') (vea php -?)
  • Capture cualquier salida y envíela al navegador. Estás protegido de cualquier error extraño. En lugar de ejecutivo recomiendo popen para que pueda matar el proceso y controlar manualmente el tiempo de espera de esperar a que termine (en caso de que mate ese proceso, puede enviar fácilmente un error al navegador);

Necesita seguridad laxa/normal (igual que todo el backend IDE) para el proceso normal de PHP que se ejecuta cuando se llama a través del navegador.

Necesita una seguridad estricta y paranoica para el proceso php.ini y php que ejecuta el script temporal (continúe e incluso sepárelo en otro equipo que no tenga acceso a red/Internet y tenga su estado revertido a fábrica cada hora solo para estar seguro).

No utilice eval(), no es adecuado para este escenario. Un atacante puede saltar a su aplicación y usar sus permisos actuales y estado de variables en su contra.

+0

En este escenario, ¿cómo recordaría los valores de las variables de PHP? ¿Contendría/ejecutaría cada archivo todo el código de la consola en la memoria? Además, no estoy seguro de que todos los pasos de seguridad que mencionó sean aplicables en mi caso de uso. Estoy pensando en una aplicación descargable para usar en un servidor local o un servidor de desarrollo, no en algo abierto al público. – VirtuosiMedia

+0

Puede establecer variables por asignación. Volver a ejecutar el archivo PHP los reasigna ... Ya sea que esté abierto al público o no, no influye en mi respuesta. Su pregunta no menciona la "aplicación descargable", solo la CLI del navegador. Este requisito de la CLI del navegador solo insinúa un tipo de cosas en Internet. De todos modos, mi respuesta todavía se puede ejecutar en localhost, a lo que se une no influye aún en la validez de la respuesta. –

+0

En caso de error, debe retrotraer a antes de la última línea/comando. –

1

La versión básica sería

  1. le guiones emite un formulario con una entrada de línea
  2. Los puntos de acción forma a su script
  3. El guión toma la entrada en el formulario y lo pasa a eval
  4. pasar cualquier salida de eval al navegador
  5. salida la forma de nuevo

El problema es que las funciones y variables definidas se pierden entre cada solicitud.

Podría agregar a cada línea que se ingrese en su sesión. Digamos

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

por esto, en cada sesión se ejecuta un script PHP completo (y, por supuesto, tendrá la salida completa).

Otra opción sería crear algún tipo de daemon (básicamente una instancia de una llamada php -a) que se ejecute en el servidor en segundo plano y obtenga su entrada del navegador y pase la salida.

Puede conectar este daemon a dos dispositivos FIFO (uno para la entrada y otro para la salida) y comunicarse mediante el simple fopen.

Para cada usuario que utiliza su secuencia de comandos, se debe generar un nuevo proceso de demonio.

Huelga decir que es importante proteger su script contra el abuso.

1

Recientemente leí acerca de un intérprete PHP escrito en Javascript php.js, por lo que podría escribir y ejecutar código PHP solo con su navegador. No estoy seguro de si esto es lo que necesitas al final, pero parece interesante.

+0

+1 Estaba a punto de publicar sobre esto también. – uzyn

1

Hemos probado algunos productos en mi universidad para obtener acceso a nuestros servidores de laboratorio y utilicé algunos de los Web-SSH-Tools, básicamente hacen exactamente lo que usted desea. El Shell-In-A-Box -Project puede estar vinculado a cualquier intérprete que desee y se puede utilizar con un intérprete de php interactivo, si lo desea (en la página de demostración, utilizaron un intérprete básico). El proyecto puede servir como base para un verdadero PHP-IDE. Éstos tienen la ventaja de ser capaces de interactuar también con cualquier editor basado en consola (por ejemplo, vi, emacs o nano), así como de poder dar comandos administrativos (por ejemplo, crear carpetas, cambiar propietarios o ACL o reiniciar un servicio).

Mozilla también tiene un IDE basado en web con todas las funciones llamado Bespin, que también es highly extensible and configurable.

Como dijiste, que la página no es para el público, por supuesto tienes que proteger la página con Autenticación y SSL para combatir session hijacking.