Ho un programma che può ricevere codice da un utente come input (questa domanda è indipendente dalla lingua, sebbene io sia principalmente interessato alle risposte per Java e Python). Di solito, questo codice sarà utile, ma non ho la garanzia che l'utente non stia commettendo un errore o che abbia fornito deliberatamente codice dannoso.
Voglio essere in grado di eseguire questo codice in modo sicuro, cioè senza effetti collaterali dannosi se risulta essere difettoso o dannoso.
Più in particolare:
-
l'utente specifica che il codice di input deve operare su alcuni oggetti presenti nel programma principale (il programma che ottiene il codice dall'utente e lo esegue). In modo ottimale, dovrebbe essere in grado di accedere direttamente a questi oggetti, ma anche inviarli al programma figlio tramite un protocollo di comunicazione o un file va bene.
-
allo stesso modo, il codice dovrebbe generare un output che viene ritrasmesso al programma padre.
-
l'utente può specificare se consentire al codice di accedere a qualsiasi altro dato, se dovrebbe essere consentito leggere o scrivere su file e se deve avere accesso a qualsiasi altra interfaccia o metodo operativo.
-
è possibile specificare un runtime massimo al termine del quale il codice verrà interrotto se non ha ancora completato l'esecuzione.
-
il programma principale e il codice da eseguire potrebbero essere lingue diverse. Si può presumere che i programmi necessari per compilare ed eseguire il codice specificato siano installati e disponibili per il programma principale. Se le lingue sono diverse, supponiamo che un certo formato standard come JSON possa essere usato per trasmettere i dati (o esiste un modo per farlo in modo più efficiente?)
Penso che questo dovrebbe essere fattibile con una macchina virtuale. Tuttavia, la velocità è una preoccupazione e voglio essere in grado di eseguire molti blocchi di codice rapidamente, in modo che la creazione e la distruzione di una VM per ciascuno di essi possa essere proibitiva.
Un'altra opzione è la creazione di una sandbox, che ad es. Java può fare, ma per quanto ne so solo per l'esecuzione di un altro codice Java. Non riesco a trovare una soluzione per farlo con le lingue arbitrarie.
Per quali lingue funziona bene, per cui è difficile?
È più semplice su alcuni SO che su altri?