如何使用户输入的C#代码安全?

时间:2012-01-18 10:59:33

标签: c# security codedom

我正在构建条件格式设置功能,用户可以在其中输入类似

的表达式
someFieldValue == "someValue"

我们根据该表达式的结果应用格式。完成此操作的最快方法(使用全功能表达式语法)似乎与CSharpCodeProvider.CompileAssemblyFromSource一致。

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

问题: IF 这是针对生产系统的,我怎样才能确保输入的表达式不会导致问题?现在它只是一个内部工具,但是如果我们将它暴露给生产系统,我想做好准备而不是沿着一条路径(C#CodeDom),只是为了以后废弃它。

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

  • 退出申请
  • 访问/修改文件/注册表/系统设置等本地资源
  • 修改内存中的对象
  • 破坏调用过程
  • 启动应用程序
  • ...

由于枚举你不能做的所有事情是不合理的,我的感觉是解决方案将涉及修改用户输入的表达式,以便它在代理对象上运行,公开所有功能我们愿意接受这个表达。这意味着不允许在表达式中进行任意函数调用。这也意味着表达式不再是标准的C#代码,最后为此使用不同的语言语法可能更实际。

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

1 个答案:

答案 0 :(得分:2)

我想你应该看看这个;

Assembly.CreateInstance and security

  

建议的方法是在a中执行可疑代码   沙盒应用程序域。有几个原因   http://blogs.msdn.com/b/shawnfa/archive/2006/04/19/579066.aspx,和   更重要的一点是大多数其他潜在的方法   自.NET 4.0起不推荐使用。