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

本文关键字:代码 安全 输入 何使 用户 | 更新日期: 2023-09-27 18:20:33

我正在构建一个条件格式化功能,用户可以在其中输入类似的表达式

someFieldValue == "someValue"

我们根据该表达式的结果应用格式。实现这一点的最快方法(使用功能齐全的表达式语法)似乎是使用CSharpCodeProvider.CompileAssemblyFromSource

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

问题:如果这是针对生产系统的,我如何确保输入的表达式不会引起问题?现在,它只是一个内部工具,但如果我们将其暴露在生产系统中,我希望做好准备,而不是走上一条路(C#CodeDom),只在以后废弃它。

一些被认为不安全的东西:

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

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

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

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

我想你应该看看这个;

Assembly.CreateInstance和安全

对此,建议的方法是在沙盒appdomain。上给出了几个原因http://blogs.msdn.com/b/shawnfa/archive/2006/04/19/579066.aspx,和更重要的是,大多数其他潜在的方法自.NET 4.0起已弃用。