【问题标题】:Limiting Functionality of Dynamic Invocation in C#在 C# 中限制动态调用的功能
【发布时间】:2013-06-11 18:01:17
【问题描述】:

我创建了一些实用程序代码,允许我将文本输入到我们的内容管理系统中,并使用类似于this 的方法动态编译和调用它。

但这会带来安全风险 - 因为内容作者可能会错误地(或更糟糕地 - 恶意地)输入代码,而这些代码会执行我所寻找的事情之外的事情。有什么建议可以保持此功能打开,但能够防止编写某些类型的代码?例如,有一些明显的事情需要限制,比如写入文件系统。

我最初的想法是排除某些程序集,但我很好奇是否有人对此有任何聪明的想法。

【问题讨论】:

  • 如何在沙箱中运行部分受信任的代码:msdn.microsoft.com/en-us/library/bb763046.aspx
  • 理想情况下,如果可能的话,您一开始就不会这样做......
  • 根据您需要做什么以及您有多少时间,编写自己的脚本引擎可能并不难,这将仅限于您允许它执行的操作。我已经为公式(工程类型的东西)做到了这一点,用户可以在其中输入基本的数学函数、if 语句,并访问各种系统值以返回所需的结果。
  • 您的选择是(按优先顺序排列)1) 不要这样做,而是另谋出路。 2) 使用部分受信任的代码,并且只允许您知道不会造成问题的操作。 Here is a similar question 给你的,我提供了关于部分受信任代码的更详细的答案。
  • 您还可以考虑为您的需要创建一种特定于域的语言。 codeproject.com/Articles/26975/…

标签: c# reflection


【解决方案1】:

不要这样做。用户可以写的东西有无限的可能性,你将无法阻止它们。为了安全起见,您应该始终指定用户可以做什么而不是他不能做什么(白名单而不是黑名单),因为如果您不这样做,您会错过一些东西。

在这种特定情况下,允许用户编写任意代码似乎从来都不是一个好主意。相反,您应该选择用户可以执行的特定操作,并为每个操作添加一个按钮/控件。

【讨论】:

    【解决方案2】:

    如果您真的需要此类功能,请考虑创建非常有限的功能。不允许用户输入文字;给他们“块”。 从非常基本的、有限的说明开始,只有在被要求时才添加新的说明。

    【讨论】:

      猜你喜欢
      • 2013-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-26
      • 2011-04-05
      • 2012-11-20
      • 1970-01-01
      • 2016-07-17
      相关资源
      最近更新 更多