2012-01-18 34 views
2

我建立一个条件格式功能,用户可以在其中输入像如何使用户输入的C#代码安全?

someFieldValue == "someValue" 

表达式,我们采用基于表达式的结果格式化。使用全功能表达式语法完成此操作的最快方法似乎是CSharpCodeProvider.CompileAssemblyFromSource

由于表达式是由用户输入的,所以这是一个巨大的安全漏洞(例如用户可以输入表达式someFieldValue == Process.Start("shutdown","/s /t 0"))。

问题:IF这是在生产系统上,我怎么能保证输入的表达式不会造成问题?现在它只是一个内部工具,但如果我们将它展示给生产系统,我希望能够做好准备,而不是走下一条路径(C#CodeDom),以便稍后取消它。

会被认为不安全的一些事情:

  • 退出应用程序
  • 访问/修改本地资源,如文件/注册表/系统设置
  • 修改对象在内存
  • 崩溃调用进程
  • 启动应用程序
  • ...

因为它是不合理的枚举所有的东西,你不能做,我的感觉是,该解决方案将涉及修改用户输入的表达式,它暴露的所有功能,我们都愿意代理对象进行操作暴露于表达。这意味着不允许在表达式中进行任意函数调用。这也意味着该表达式不再是标准的C#代码,并且最后为此可能更加实用一些不同的语言语法。

能够使用C#的好处是巨大,因为我们希望允许在C#中使用表达式中的“插件”,并且它允许与现有代码进行良好的无缝集成。我接受一种解决方案是使用JavaScript这样的脚本语言,但我想确保我们必须首先排除C#。

+0

也许使用DynamicExpression来允许一定数量的运算符/表达式。或者更一般地说,将表达式字符串解析到表达式树中,您可以在其中获得允许的节点列表。 – 2012-01-18 11:04:23

+0

您正在描述一名用户正在攻击*自己*。用户被允许攻击自己。为什么这是一个安全漏洞? – 2012-01-18 15:14:01

+1

Web服务器。表达式是由客户端输入的,但是如果访问权限不受限制,它们可能会对服务器造成严重破坏。目前它只是供内部使用,所以这不是问题,但在生产中它是不可接受的。尽管AppDomain解决了这个问题。 – tenfour 2012-01-18 15:22:05

回答

2

我想你应该看看这个;

Assembly.CreateInstance and security

这个建议的方法是在 沙盒应用程序域执行可疑代码。在 http://blogs.msdn.com/b/shawnfa/archive/2006/04/19/579066.aspx和 上给出了几个原因,更重要的一点是从.NET 4.0开始,已弃用大多数其他潜在方法 。

+2

谢谢 - 我现在已经实现了这一点,实际上AppDomain正是我所需要的。对于那些有兴趣的人来说,一个好的资源是[这篇文章](http://msdn.microsoft.com/en-us/library/bb763046.aspx) – tenfour 2012-01-18 13:51:28

相关问题