【问题标题】:.NET DLR safe or sandboxed script.NET DLR 安全或沙盒脚本
【发布时间】:2011-02-19 06:51:19
【问题描述】:

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

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

另外,用户只能输入函数体,函数头和参数说明在传递给 Python DLR 引擎之前会自动预先添加到代码中,以便调用它的系统的 C# 端准确地知道参数过去和回来的东西。用户只需要完全基于作为参数提供的值进行简单的操作和测试。

例如

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

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

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

【问题讨论】:

    标签: .net ironpython dynamic-language-runtime


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-09
      • 2011-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多