2012-07-19 5 views
8

Sto considerando l'idea di un IDE PHP basato su browser e sono curioso della possibilità di emulare la riga di comando tramite il browser, ma non mi è abbastanza familiare con lo sviluppo di strumenti per la CLI per sapere se è qualcosa che potrebbe essere fatto facilmente o affatto. Mi piacerebbe fare ulteriori indagini, ma finora non sono stato in grado di trovare molte risorse su di esso.Emulazione della CLI di PHP in un browser

Da un alto livello, il mio primo istinto è quello di impostare un input di testo che possa inviare comandi a uno script PHP tramite AJAX e restituire qualsiasi output sulla pagina. Non sono abbastanza familiare con la CLI per sapere come interfacciarlo con esso in quel contesto.

Non ho bisogno di codice reale, anche se sarebbe utile, ma sto cercando più di quali funzioni, classi o API dovrei investigare ulteriormente. Idealmente, preferirei qualcosa di elaborato in PHP (supponiamo PHP 5.3) e non una libreria di terze parti. Come affronteresti questo? Ci sono risorse o progetti che dovrei sapere?

Modifica: Il caso di utilizzo per questo sarebbe un localhost o un server di sviluppo, non un sito pubblico.

+1

possibile duplicato di [REPL Environment per il Web] (http://stackoverflow.com/questions/5918670/repl-environment-for-the-web) –

+0

@ IgnacioVazquez-Abrams - Non è un duplicato. Sto cercando di costruire il mio, non utilizzare uno strumento di terze parti. L'unica risposta specifica per PHP è phpsh, che è scritto in python, quindi non mi aiuta in realtà a crearlo in PHP. – VirtuosiMedia

+0

Cosa succede se qualcuno esegue 'unlink ('/')'? –

risposta

2

chiamare questa funzione attraverso una RPC o un POST diretta da JavaScript, che fa le cose in questo ordine:

  • scrivere il codice PHP in un file (con un nome casuale) in una cartella (con un caso nome), dove si siederà da solo, eseguirà e quindi verrà eliminato alla fine dell'esecuzione.
  • L'attuale processo PHP non esegue il codice in quel file. Invece deve avere permessi exec (safe_mode off). exec('php -c /path/to/security_tight/php.ini') (vedi php -?)
  • Cattura l'output e invialo di nuovo al browser. Sei protetto da eventuali errori strani. Invece di exec I consiglia di popen in modo che tu possa terminare il processo e controllare manualmente il timeout di attesa che finisca (nel caso in cui tu uccida quel processo, puoi facilmente inviare un errore al browser);

È necessario lassista/normali garanzie (lo stesso come l'intero back-end IDE) per il processo di PHP normale che corre quando viene chiamato attraverso il browser.

È necessaria una sicurezza rigorosa e paranoica per il processo php.ini e php che esegue lo script temporaneo (andare avanti e persino separarlo su un'altra macchina che non ha accesso a rete/Internet e il suo stato è stato ripristinato ogni ora in fabbrica per essere sicuro).

Non utilizzare eval(), non è adatto per questo scenario. Un utente malintenzionato può saltare nell'applicazione e utilizzare lo stato delle autorizzazioni e delle variabili correnti contro di te.

+0

In questo scenario, come dovresti ricordare i valori delle variabili PHP? Ogni file conteneva/eseguiva tutto il codice della console in memoria? Inoltre, non sono sicuro che tutte le misure di sicurezza che hai menzionato sarebbero applicabili nel mio caso d'uso. Sto pensando ad un'app scaricabile per l'uso su un localhost o su un server di sviluppo, non qualcosa di aperto al pubblico. – VirtuosiMedia

+0

È possibile impostare variabili per assegnazione. Rieseguire il file PHP li riassegna ... Se è aperto al pubblico o no, non influenza la mia risposta. La tua domanda non menziona "app scaricabile", solo la CLI del browser. Questo requisito della CLI del browser non fa altro che suggerire un tipo di cosa su Internet. Indipendentemente da ciò, la mia risposta è ancora eseguibile su localhost, ciò a cui leghi ancora non influenza la validità della risposta. –

+0

In caso di errore, è necessario eseguire il rollback prima dell'ultima riga/comando. –

1

La versione di base sarebbe

  1. vi script emette un modulo con un ingresso di linea
  2. i punti d'azione modulo per lo script
  3. Lo script prende l'input sulla forma e lo passa a eval
  4. passare qualsiasi output eval al browser
  5. uscita nuovamente il modulo

Il problema è che le funzioni e le variabili definite vengono perse tra ogni richiesta.

Potrebbe essere necessario aggiungere ogni riga inserita nella sessione. Diciamo

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

da questo, in ogni sessione una viene eseguito lo script completo di PHP (e, naturalmente, si otterrà la piena potenza).

Un'altra opzione sarebbe quella di creare una sorta di demone (in pratica un esempio di una chiamata php -a) che viene eseguito sul server in background e riceve l'input dal browser e passa l'uscita.

È possibile connettere questo demone a due dispositivi FIFO (uno per l'ingresso e uno per l'uscita) e comunicare tramite semplice fopen.

Per ogni utente che utilizza lo script, è necessario generare un nuovo processo daemon.

Inutile dire che è importante proteggere il copione dagli abusi.

1

Recentemente ho letto di un interprete PHP scritto in Javascript php.js, quindi è possibile scrivere ed eseguire codice PHP utilizzando solo il browser. Non sono sicuro se questo è ciò di cui hai bisogno alla fine, ma sembra interessante.

+0

+1 Sta per pubblicare anche questo. – uzyn

1

Abbiamo testato alcuni prodotti presso la mia università per l'accesso ssh ai nostri server di laboratorio e ho utilizzato alcuni degli Web-SSH-Tools: in pratica fanno esattamente ciò che volete. Il progetto Shell-In-A-Box -Project può essere associato a qualsiasi interprete che ti piace e può essere utilizzato con un interprete php interattivo, se lo desideri (nella pagina dimostrativa, hanno usato un interprete di base). Il progetto può servire come base per un vero IDE PHP. Questi hanno il vantaggio di essere in grado di interagire con qualsiasi editor basato su console (ad es. Vi, emacs o nano), oltre ad essere in grado di fornire comandi amministrativi (ad esempio creare cartelle, modificare proprietà o ACL o riavviare un servizio).

Mozilla ha anche un IDE Web completo denominato Bespin, che è anche highly extensible and configurable.

Come hai affermato, che la pagina non è destinata al pubblico, devi ovviamente proteggere la pagina con Autenticazione e SSL per combattere session hijacking.