2010-11-15 13 views
7

Mi tuffo nello sviluppo del web dopo dieci anni di sviluppo del desktop e sto sperimentando alcuni concetti di test. Mi stavo chiedendo se è possibile eseguire sandbox ed eseguire il codice C++ inserito in un campo di testo in un browser? Con ciò intendo dire eseguire il codice C++ o C# sul server web di back-end e restituire un'analisi del codice. Per essere chiari, non intendo eseguire codice C++ o C# che è destinato a generare alcun tipo di markup, ma semplicemente a blackbox testare il blocco di codice C++ o C# inserito.È possibile eseguire sandbox ed eseguire codice C++ o C# immesso in un campo di testo in un browser?

  1. Come si invoca il compilatore, a seconda del server Web che si sta utilizzando?
  2. In che modo è possibile eseguire la sandbox del codice per impedire comportamenti dannosi? Se stiamo considerando solo una delle varianti C, che dire delle blacklisting/whitelisting specifiche funzioni e librerie per prevenire comportamenti malevoli? O quella lista nera sarebbe troppo lunga e troppo limitante per consentire l'esecuzione di una buona quantità di codice?

Queste sono alcune domande di alto livello che sto chiedendo solo perché ho difficoltà a trovare una direzione, ma ho intenzione di continuare a ricercarle in questo momento. Grazie mille in anticipo per il tuo aiuto!

+0

il loro sarebbe un modo di fare questo ... ma io sono più bloccato sul perché si vorrebbe fare questo ... – thecoshman

+0

@thecoshman, per ragioni simili al motivo per cui il sito web di codepad (vedi risposte di seguito) esiste, solo condividere il codice e i loro risultati di runtime. – BeachRunnerFred

risposta

2

Il Dinkumware site ha qualcosa del genere.

Un semplice Perl (o Python, ...) cgi potrebbe essere utilizzato per richiamare il compilatore, analizzare i risultati, eseguire l'eventuale eseguibile risultante e visualizzarne i risultati.

Vorrei dare un'occhiata a SELinux (forse AppArmor?) Per i controlli di accesso. Forse non permettendogli di scrivere e leggere da/sul disco e di limitarne il tempo di esecuzione. Non so se il successivo possa essere fatto anche con SELinux.

2

# 1 è facile con C#. Le funzionalità di Reflection di .NET consentono di eseguire compile and run code "on the fly." ed ecco un collegamento a another good looking tutorial.

# 2 è un po 'più difficile, ma suppongo che una tecnica sand box di base potrebbe comportare l'esecuzione di un processo dinamico con un account limitato, e quindi sand boxed. A livello di programmazione è possibile analizzare le dipendenze dell'assieme generato in modo dinamico e non consentirne l'esecuzione se utilizza API in determinati spazi dei nomi come System.IO. Questo non è banale, per usare un eufemismo.

C++ non ha capacità di riflessione e quindi le librerie di terze parti sono la soluzione migliore.

+0

Grazie, Paul, sembra una grande capacità da esplorare! – BeachRunnerFred

1

Se il server esegue Linux, potete prendere in considerazione chroot

+0

È necessario un accesso root per questo, e chroot cambia semplicemente la root. (Da qui il nome), NON è una sandbox, e non è mai stato progettato per quello scopo. – Arafangion

1

In realtà abbiamo fatto proprio questo con il nostro prodotto chiamato iKnode. Stiamo usando questa idea per creare un back-end nel cloud.

Abbiamo fatto questo creando un SandBox che prende un pezzo di codice specifico e lo esegue, acquisisce il risultato e lo restituisce all'utente. Questo è tutto fatto nel cloud.

Come si richiama il compilatore, a seconda del server Web utilizzato ?

L'abbiamo fatto utilizzando le utilità di CodeDom dal framework .Net.E stiamo esplorando l'imminente progetto "compilatore come servizio" proveniente da Microsoft, chiamato in codice Roslyn.

Questo è un buon punto di partenza per l'utilizzo di CodeDom da compilare in modo programmatico.

In che modo è possibile eseguire la sandbox del codice per prevenire comportamenti dannosi? Se siamo considerando solo una delle varianti C, che dire di liste nere/whitelisting specifiche funzioni e librerie per prevenire il comportamento dannoso ? O quella lista nera sarebbe troppo lunga e anche la limitazione per consentire l'esecuzione di una buona quantità di codice?

Abbiamo eseguito l'operazione eseguendo l'esecuzione del codice in un AppDomain separato e limitato. Puoi vedere alcuni esempi here.

Inoltre, si potrebbe voler esaminare il MonoSandBox, che è stato creato per Moonlight, ma è un SandBox più robusto. Stiamo sperimentando in questo momento, per allontanarci dagli AppDomain. Riteniamo che MonoSandBox sia decisamente migliore dei semplici AppDomain.

Problemi correlati