.NET DLR安全或沙箱脚本

6

我正在一个较大的C#项目中使用DLR,使用的语言是IronPython。

对于系统的某些部分,用户可以输入小型脚本来自定义其行为。我想要做的是限制他们只能使用无副作用的纯函数或在某种沙盒中运行,以使其函数不能触碰到外部的任何东西。

此外,用户只能输入函数体,函数头和参数规定会在代码中自动添加,然后传递给Python DLR引擎,以便调用它的C#端知道需要传递的参数和返回值。用户只需要基于提供的参数进行简单操作和测试。

例如:

这个是可以的:return (a * 100) > b;

这个不可以:delete_file_system(); return (a * 100) > b;

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

1个回答

7
创建沙盒应用程序域并在其中运行脚本是实现此目的的方法。您可以在此处找到有关创建沙箱域的说明:http://msdn.microsoft.com/en-us/library/bb763046.aspx 要在应用程序域中运行代码,可以使用Python.CreateEngine重载,该重载接受一个AppDomain参数。然后,在该引擎中执行的所有代码都将在该应用程序域中运行。
如果您想使用户代码回调到您的主机中,可以创建从MarshalByRefObject派生的类,并将其放在他们可以访问和回调的范围内。这些调用将流经您的常规应用程序域,您可以做任何您通常能够做的事情。
还有一堆ObjectOperations和ScriptScope上的API,这些类使用ObjectHandles在远程域中执行对象操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接