2011-11-29 61 views
6

我在使用C#的能力来按需编译代码作为脚本语言的基础。我想知道,我如何对我正在执行的脚本进行沙盒处理,以便它们无法访问文件系统,网络等。基本上,我希望对正在运行的脚本拥有有限的权限。Assembly.CreateInstance和安全

的步骤,我采取:

CompilerResults r = CSharpCodeProvider.CompileAssemblyFromSource(source); 

Assembly a = r.CompiledAssembly; 

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

s.EntryPoint(...); 

回答

-2

编辑:无视的是,它不是安全!

检出System.Security.Permissions.SecurityPermission(和子类FileIOPermission)和this tutorial。如果你想从临时做不安全的行为否认的代码,你可以使用语句如下:

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

是否有任何东西阻止CallyourScriptHere()恢复您的示例中设置的所有权限? – MarkP

+0

'RevertAll'仅恢复当前堆栈帧中设置的CAS权限,因此在'CallYourScriptHere'中调用它只会撤消在该方法中所做的更改。 – MagnatLU

+0

这不能有效防范潜在的恶意代码。请参阅http://blogs.msdn.com/b/shawnfa/archive/2006/02/02/523390.aspx,了解为什么不应将堆栈走路修饰符用于沙盒。 –