2011-11-29 19 views
6

Estoy jugando con la idea de usar la capacidad de C# para compilar código según demanda como base de un lenguaje de scripting. Me preguntaba, ¿cómo puedo guardar los scripts que estoy ejecutando para que no puedan acceder al sistema de archivos, a la red, etc. Básicamente, quiero permisos restringidos en el script que se está ejecutando.Assembly.CreateInstance and security

pasos que he tomado:

CompilerResults r = CSharpCodeProvider.CompileAssemblyFromSource(source); 

Assembly a = r.CompiledAssembly; 

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

s.EntryPoint(...); 

Respuesta

-2

Editar: indiferencia que, no es seguro!

Echa un vistazo a System.Security.Permissions.SecurityPermission (y las subclases como FileIOPermission) y this tutorial. Si desea denegar el código temporal de realizar acciones inseguras, puede utilizar declaraciones como esta:

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

¿Hay algo que impida que CallyourScriptHere() revierte todos los permisos establecidos por su ejemplo? – MarkP

+0

'RevertAll' revierte los permisos de CAS configurados en el marco de pila actual solamente, por lo que al llamarlo a 'CallYourScriptHere' solo se deshacerían los cambios realizados en ese método. – MagnatLU

+0

Esta no es una protección efectiva contra códigos potencialmente maliciosos. Consulte http://blogs.msdn.com/b/shawnfa/archive/2006/02/02/523390.aspx para saber por qué los modificadores de paseo de pila no se deben usar para sandboxing. –