2011-02-18 85 views
6

我在一个较大的C#项目的一小部分内使用DLR,IronPython是有问题的语言。.NET DLR安全或沙盒脚本

对于系统的某些部分,用户可以输入一个小脚本来为他们​​定制行为。我想要做的是能够限制他们使用副作用免费的纯函数或在某种沙箱中,这样他们的功能就不会碰到任何外部的东西。

此外,用户只能输入一个函数体,函数头和参数说明在被传递到Python DLR引擎之前会自动预先写入代码中,以便调用它的系统的C#端完全知道要走过,什么回来。用户只需要基于作为参数提供的值进行简单的操作和测试。

例如

这是确定:return (a * 100) > b;

这是不正常:delete_file_system(); return (a * 100) > b;

会如何实现这一目标?是否有更合适的语言或技术选择?

回答

7

执行此操作的方法是创建一个沙盒应用程序域,然后在该应用程序域中运行脚本。您可以在此处找到有关创建沙盒域的说明:http://msdn.microsoft.com/en-us/library/bb763046.aspx

要运行应用程序域中的代码,您可以使用接受AppDomain的Python.CreateEngine重载。然后,该引擎中执行的所有代码都将在该应用程序域中运行。

如果要将用户代码回拨到主机中,您可以创建一个从MarshalByRefObject派生的类,并将其放入该范围以供其访问和回叫。通话将通过您的正常应用程序域,您可以完成您通常能够完成的任何事情。

ObjectOperations和ScriptScope上还有一些API,这些API与ObjectHandles一起使用,用于在远程域中对对象执行操作。