使用C#作为我的DSL - 这是可能的,如果是这样,怎么样?

时间:2012-10-18 22:33:11

标签: c# security dsl

是否可以使用C#作为DSL ,其中C#源代码由最终用户在TextBox中编辑,在应用程序运行时编译,然后由已经运行的应用程序调用?

我问,因为在接下来的几个月里,我将需要实施一个简单的数学运算DSL(类似于Rachel Lim在http://rachel53461.wordpress.com/2011/08/20/the-math-converter/发表的博客 我专注于她的代码的数学处理方面,而不是XAML / Converter方面。我会反对重用她的代码,因为我想添加if语句和可能的其他功能。如果我可以使用C#本身,那么我可以获得所有功能,而无需重新实现它们。

如果可以这样做,我想用什么框架或命名空间或类来实现这一目标?

请注意,我对C#派生的DSL做的一件事是使用头语句所有必要的硬代码,然后删除精明用户输入的所有使用语句。这样做的目的是减少最终用户试图利用我的类似C#的DSL进入一个完整的编译器的前景,这个编译器违背了他们的企业策略的意愿,或者没有站点管理员的知识。 我建议管理使用语句是否足以防止用户恶作剧?

最后,如果到目前为止的所有答案都是“是”,那么这种方法的缺点是什么,特别是引入安全漏洞的缺点?

3 个答案:

答案 0 :(得分:4)

  

我建议使用语句管理是否足以防止用户恶作剧?

没有。您还必须删除对完全限定类的引用。然后,用户仍然可以使用反射来访问他们未以任何方式引用的类。

您需要创建一个单独的应用程序域来包含用户的代码,然后您可以适当地沙箱。 Here is a relevant article on MSDN,深入解释了这一过程。

答案 1 :(得分:1)

删除使用指令无济于事,除非您还找到一些方法来阻止用户写入例如System.Diagnostics.Process.Start("evilprogram.exe")。这样做(不会阻止属性访问)将要求您使用C#解析器。

但是,您可以使用代码访问安全性。

答案 2 :(得分:1)

Stackoverflow现在自动将链接答案转换为评论。真可爱。

Compile and run dynamic code, without generating EXE?

无论如何,答案在于Microsoft.CSharp.CSharpCodeProvider