我正在构建条件格式设置功能,用户可以在其中输入类似
的表达式someFieldValue == "someValue"
我们根据该表达式的结果应用格式。完成此操作的最快方法(使用全功能表达式语法)似乎与CSharpCodeProvider.CompileAssemblyFromSource
一致。
因为表达式是由用户输入的,所以这是一个巨大的安全漏洞(例如,用户可以输入表达式someFieldValue == Process.Start("shutdown","/s /t 0")
)。
问题: IF 这是针对生产系统的,我怎样才能确保输入的表达式不会导致问题?现在它只是一个内部工具,但是如果我们将它暴露给生产系统,我想做好准备而不是沿着一条路径(C#CodeDom),只是为了以后废弃它。
一些被认为不安全的事情:
由于枚举你不能做的所有事情是不合理的,我的感觉是解决方案将涉及修改用户输入的表达式,以便它在代理对象上运行,公开所有功能我们愿意接受这个表达。这意味着不允许在表达式中进行任意函数调用。这也意味着表达式不再是标准的C#代码,最后为此使用不同的语言语法可能更实际。
能够使用C#的好处是 HUGE ,因为我们希望允许C#中的“插件”可以在表达式中使用,并且它允许与现有代码的良好无缝集成。我接受一个解决方案是使用像javascript这样的脚本语言,但我想确保我们必须首先排除C#。
答案 0 :(得分:2)
我想你应该看看这个;
Assembly.CreateInstance and security
建议的方法是在a中执行可疑代码 沙盒应用程序域。有几个原因 http://blogs.msdn.com/b/shawnfa/archive/2006/04/19/579066.aspx,和 更重要的一点是大多数其他潜在的方法 自.NET 4.0起不推荐使用。