在您希望允许用户定义搜索过滤器的情况下,是否可以获取字符串,动态编译该字符串,并在沙箱中执行该字符串,该沙箱不允许用户访问该字符串之外的任何内容。沙箱中。
考虑我的应用程序有一个对象列表。我想允许超级用户在界面中编写C#(因此,字面意思是在浏览器内的textarea中)并将其作为字符串(作为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
)。
我意识到这显然可能是一个坏主意。其中一些是假设的 - 我对在代码中运行沙盒代码的理论非常感兴趣,超出了这个例子的细节。
答案 0 :(得分:1)
.NET就是为此而设计的。它完全支持沙盒,具有复杂的权限系统,可以控制安全性。基本思想是在单独的AppDomain
中运行C#代码,它根本没有权限。这可能会使您与应用程序的接口变得有些棘手 - 小心。
但是,代码未在完整隔离中运行。阻止File.Delete
很容易。阻止反射很容易(事实上,由于显而易见的原因,在完全可信的环境中反射只能 - 以及不安全的代码)。有可能使用它以危险的方式与其他AppDomain
进行交互 - 我真的不确定。选择一组确切的权限来为您提供您想要公开的功能,而不会暴露任何危险的东西也可能很棘手 - 您可能需要制作自己的沙盒方法,为您提供相当严格的方法来处理工作需要(这允许您例如通过您的方法允许某些文件操作,而不允许对沙盒应用程序进行任何文件操作)。
这对你来说足够安全吗?很难说。但是,用户甚至有动机恶意使用这种方法吗?如果他们这样做,你可能想要使用自己的语言,而不是使用C# - 非常具体。如果他们不这样做,你真的不必费心 - 甚至处理代码权限可能是一种矫枉过正( 难以使用 - 这可能会浪费时间)