我的客户希望增加用户定义小脚本的能力,这些小脚本可用于在现有的Web应用程序中运行各种计算。当前,我们正在探索使用Microsoft.CodeAnalysis.Scripting.CSharp中的CSharpScripts动态编译和执行用户功能。
我希望能够对这些脚本进行沙箱处理。具体来说,我想限制脚本可以使用的资源(内存等),并限制脚本可以访问的库或值(例如,我不希望用户在脚本中进行Web服务调用)。我想避免用户编写会对应用程序其余部分产生负面影响的代码的情况。
我在下面包括了一些示例代码
private static Script<double> GetCompiledScript(string userFunction)
{
var options = ScriptOptions.Default.AddReferences(References).AddImports(Imports);
var script = CSharpScript.Create<double>(expression, options, typeof(Globals));
script.Compile();
return script;
}
public static String[] Imports => new[]
{
"System",
"System.Linq",
"System.Collections.Generic"
};
public static Assembly[] References => new[]
{
typeof(System.Object).GetTypeInfo().Assembly,
typeof(System.Linq.Enumerable).GetTypeInfo().Assembly,
};
public class Globals
{
public Dictionary<string, double> vars { get; set; }
}