C#在嵌入脚本解释器时限制名称空间

问题描述:

我正在研究实现一个系统,其中用户能够将脚本传递到我们的服务器并让它们执行。谢天谢地,Embedding Python into C#有充足的资源。不过,我最担心的是用户传递访问系统功能的脚本,并导致恶意的结果。主要的例子是:写入服务器上的文件不受限制。C#在嵌入脚本解释器时限制名称空间

我一直在寻找一个好办法,完全限制在严格的只是我们提供给客户,但大部分我找到命中的基本"here's how you embed a script interpreter in C#"但从未提及任何安全问题,例如限制访问的框架类的脚本的访问。 无可否认,我可以对脚本进行初步传递并搜索任何blacklisted code,但总有机会错过任何东西。

没有要求执行哪种语言,最好是可以提前编译的东西。服务器将运行C#来回答请求并将一些委托给用户创建的代码。我只是无法找到任何限制用户编码访问的语言的方法。

+0

查看[FLEE](http://flee.codeplex.com/)或[NCalc](http://ncalc.codeplex.com/)。两者都应允许您将用户限制为允许的类型,并允许您根据需要公开/创建专用(安全)方法包装。编辑:虽然这些都集中在单个表达式上(尽管你可以制作一些非常复杂的表达式),但它们可能足以满足需要。 – 2013-03-03 19:59:52

我强烈建议您使用Lua,这是专门用于这种事情。无论用户编写还是内置,每个函数都是表中的一个条目,因此可以非常轻松地限制脚本的功能。例如,除去io表格是防止恶意文件系统更改的简单方法。

+0

这听起来像你在谈论像[从os库中删除函数](http://*.com/questions/10108933/how-to-remove-particular-functions-from-os-library-without-editing -the-lua-heade),这听起来像我正在寻找的东西。如果一切正常,我会明天检查出来,并检查你的答案。谢谢。 – Muuski 2013-03-04 11:03:54

+0

任何嵌入式Lua脚本的全局环境(符号表)完全由调用该脚本的C代码控制。该脚本无法访问任何未出现在此表中的内容,并且因为它是任何其他类似的Lua表,所以删除不需要的元素很简单。标准的Lua库是通过环境的子表访问的,所以只要删除'io'元素就可以防止访问任何I/O函数,同时还可以使用无害的'数学'和'字符串'等库。 – Borodin 2013-03-04 11:34:21