【问题标题】:C# Scripting and SecurityC# 脚本和安全性
【发布时间】:2011-10-31 19:58:12
【问题描述】:

在我的游戏(也是用 C# 编写的)中,我想包含某种自定义支持。 速度是一个很大的问题,因为我计划将游戏的主要部分卸载到脚本中。 因此,我选择使用 C# 编写游戏内事件和内容的脚本。 用户还应该能够使用 C# 为游戏编写脚本和插件。 (我知道 C# 不是脚本语言。)

我将为用户提供一个(静态)类,其中包含与游戏交互所需的所有功能。 用户还可以提供代码作为源代码(在这种情况下,游戏将编译它)。 编译用户“脚本”在某些情况下可以/也将传输给其他玩家。 例如,用户可以在家中或其他任何地方构建脚本陷阱。

这是我的问题:

  1. 安全

    如何确保提供的代码只能调用提供的 API(类)的东西?为了防止脚本作弊、恶意活动...

    有没有办法在某种虚拟机或低信任环境中运行编译后的代码??

  2. 速度

    这种方法是否足够快? (每秒或每秒从多达 100 个自定义程序集中调用函数)。 这方面有什么建议吗?

    也许可以通过将所有用户内容编译成一个大程序集或其他什么来获得速度优势??

  3. 尺寸

    我怎样才能使编译后的代码变小(除了压缩它)? 因为玩家可能需要下载几十个脚本……

    有没有办法去除非绝对必要的东西?比如调试信息或类名之类的......

运行时编译对我来说相当新(这就是我在这里问的原因)。因此,最好能指出一些主要的初学者错误和/或安全问题。

编辑:

只是为了澄清: 用户插件/脚本或任何你想调用的东西都是一个类(也是用 C# 编写的),它必须实现特定的功能,如“GetAddonInfo”、“Init”、“Update”...... 就像从我的抽象“Addon”类派生的普通 C# 类一样。

【问题讨论】:

    标签: c# security scripting dynamic-compilation


    【解决方案1】:

    你想看看这个旧 Microsoft 示例项目的返工

    http://terrarium2.codeplex.com/

    它基本上可以满足您的所有需求。

    将代码编译成DLL并在环境中运行

    检查允许的 API 调用。

    等等

    第 2 版经过重新编写,以利用 Web 服务和许多其他功能。从您的问题来看,您可能对 Terrarium 1 更感兴趣。但是,我似乎无法找到它,因此您可能不得不“解决”更复杂的 2.0 版本。

    【讨论】:

      【解决方案2】:

      看看 MEF 和 MAF——它们都是旨在将 C# 和 VB 脚本添加到现有应用程序的框架。您可以为您的脚本创建一个 appdomain,然后使用代码访问安全性来严格限制这些脚本可以执行的操作。

      这个问题可能会有所帮助。

      Choosing between MEF and MAF (System.AddIn)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-04
        • 2022-06-15
        相关资源
        最近更新 更多