c#可以在另一个进程中独立的、安全的、沙盒环境中执行吗?

本文关键字:环境 执行 安全 进程 另一个 独立 | 更新日期: 2023-09-27 18:18:11

当你想让用户定义搜索过滤器时,是否可以取一个字符串,动态编译它,并在沙箱中执行它,而不允许它访问沙箱外的任何东西?

假设我的应用程序有一个对象列表。我想允许高级用户在界面中编写c# (因此,实际上是在浏览器的文本区域中)并以字符串(作为POST)接收它。

像这样:

var foo = "bar";
return objects.Where(o => o.Property == foo);

再次,我将得到这个字符串(这不是从Visual Studio编译出来的)。然后我可以动态地将它编译成一个临时的助手类(这是简单的部分——我已经这样做了)。

我没有做的是以这样一种方式执行,我知道它不会对自身之外的资源产生负面影响。因为,让我们面对现实吧,他们可以这样写:

File.Delete(Path.Combine(AppDomain.Current.BaseDirectory), "web.config"));

这显然是不好的,但是因为他们把c#写成字符串并动态编译,我不确定我能做什么。

我想做的是编译和执行这个字符串,使它只能访问我给它的资源。它将被编译成如下所示:

public static class Temp : IDynamicFilter
{
  public static List<MyClass> Filter(List<MyClass> objects)
  {
    [their string goes here]
  }
}

则调用Filter(从IDynamicFilter)。

我意识到这显然是个坏主意。其中一些是假设的——我对在代码中运行沙盒代码的理论很感兴趣,而不是这个例子的细节。

c#可以在另一个进程中独立的、安全的、沙盒环境中执行吗?

。NET就是为此而设计的。它完全支持沙箱,具有复杂的权限系统,可以让您控制安全性。基本的想法是,你在一个单独的AppDomain中运行c#代码,它根本没有权限。这可能会使与应用程序的交互变得有些棘手——要小心。

但是,代码不是在完全隔离状态下运行的。阻断File.Delete很容易。阻塞反射很容易(事实上,反射在完全可信的环境中只有是可能的,原因很明显——还有不安全的代码)。它可能会以危险的方式与其他AppDomain进行交互——我真的不确定。在不暴露任何危险的情况下,选择一组精确的权限来给你想要暴露的功能也可能是棘手的——你可能需要制作你自己的沙盒方法,给你相当严格的方法来处理所需的工作(这允许你通过你的方法允许某些文件操作,而不允许任何文件操作到沙盒应用程序)。

这对你足够安全吗?很难说。然而,用户是否有动机恶意使用这些功能呢?如果是这样,您可能想使用自己的语言,而不是使用c#——一些非常具体的语言。如果它们不这样做,您就不必太费心了—甚至处理代码权限也可能是多余的(如果很难使用—这可能会导致浪费时间)。