2011-11-29 14 views
6

Mi sto prendendo gioco dell'idea di utilizzare la capacità di C# di compilare il codice su richiesta come base di un linguaggio di scripting. Mi chiedevo, come posso sandbox gli script che sto eseguendo in modo che non possano accedere al file system, alla rete, ecc. Fondamentalmente, voglio permessi limitati per lo script che viene eseguito.Assembly.CreateInstance and security

passaggi che prendo:

CompilerResults r = CSharpCodeProvider.CompileAssemblyFromSource(source); 

Assembly a = r.CompiledAssembly; 

IScript s = a.CreateInstance(...); 

s.EntryPoint(...); 

risposta

-2

Edit: disprezzo che, non è sicuro!

Verificare System.Security.Permissions.SecurityPermission (e sottoclassi come FileIOPermission) e this tutorial. Se si vuole negare temporaneamente il codice dal fare azioni non sicure, è possibile utilizzare le istruzioni in questo modo:

NamedPermissionSet ps = new NamedPermissionSet("Nothing"); 
ps.Deny(); 
CallYourScriptHere(); 
CodeAccessPermission.RevertAll(); 
+0

C'è qualcosa che impedisce a CallyourScriptHere() di ripristinare tutte le autorizzazioni impostate dal tuo esempio? – MarkP

+0

'RevertAll' ripristina le autorizzazioni CAS impostate solo nello stack frame corrente, quindi chiamarlo in' CallYourScriptHere' annullerebbe solo le modifiche apportate in quel metodo. – MagnatLU

+0

Questa non è una protezione efficace contro codice potenzialmente dannoso. Vedi http://blogs.msdn.com/b/shawnfa/archive/2006/02/02/523390.aspx per il motivo per cui i modificatori del walkman non dovrebbero essere utilizzati per il sandboxing. –