.NET DLR安全或沙盒脚本

时间:2011-02-18 22:26:25

标签: .net ironpython dynamic-language-runtime

我在较大的C#项目的一小部分内使用DLR,IronPython是有问题的语言。

对于系统的某些部分,用户可以输入一个小脚本来自定义它们的行为。我想做的是能够限制它们使用无副作用的纯函数或某种沙盒,以便它们的功能不会触及外面的任何东西。

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

e.g。

这没关系:return (a * 100) > b;

这不行:delete_file_system(); return (a * 100) > b;

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

1 个答案:

答案 0 :(得分:7)

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

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

如果要将用户代码调用回主机,可以创建一个派生自MarshalByRefObject的类,并将其放在范围内,以便他们访问和回调。通话将进入您的正常应用程序域,您可以执行通常能够执行的所有操作。

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