【发布时间】:2016-02-18 01:41:51
【问题描述】:
截至this 文章我想编写一个小 C# 脚本引擎来工作。我试过这段代码:
System.IO.StreamReader sr = new System.IO.StreamReader("example.txt");
var prog = sr.ReadToEnd();
sr.Close();
ScriptOptions so = ScriptOptions.Default;
Console.WriteLine(CSharpScript.RunAsync(prog, so).Result.GetVariable("sum").Value);
Console.ReadKey();
而example.txt的文件内容为:
System.IO.StreamReader sr = new System.IO.StreamReader("foo.txt");
string s = sr.ReadToEnd();
int sum = System.Convert.ToInt32(s);
现在我想限制用户只能使用 C# 的基本函数(使用 int、string、while、for)和一些自定义函数,而不是整个 .NET 库。但即使我不包括 System.IO als 引用,用户也可以键入 System.IO.something 并得到正确的结果。
是否有可能从脚本中删除对“系统”的访问权限?
我很高兴有任何答案。
【问题讨论】:
-
“从脚本中删除对“系统”的访问权限”是什么意思?
-
不应该有任何可能使用系统的任何元素。例如。编写脚本的用户根本不能使用 System.IO.StreamReader、System.Convert 或 System.Threading.Thread。
-
你想实现沙盒,还是禁用
System命名空间中的任何东西?后者可以通过分析您的输入代码并检查每个符号的名称空间来实现。前者可以通过将代码加载到单独的应用域中,并指定应用域的权限来完成。 -
我想构建类似脚本 API 的东西,其中 C# 应用程序为用户提供了一些方法,例如包装文件访问。例如,我想确保文件只能写入某个文件夹及其子文件夹。因此,我想限制用户使用 System.IO 等,但使用我的预定义方法在他们执行请求之前检查。 AppDomain 方法对我来说似乎相当不错。但是我怎样才能在不限制它们的情况下提供这些方法呢?我可以从新的 AppDomain 回调原始应用程序以仅限制用户代码而不限制我的 API 方法吗?
标签: c# scripting visual-studio-2015 roslyn