gpt4 book ai didi

Ruby 沙盒与集成脚本语言

转载 作者:数据小太阳 更新时间:2023-10-29 06:37:01 25 4
gpt4 key购买 nike

我目前正在使用 Ruby 开发基于文本的游戏引擎,应用程序分为/lib 中的 Ruby 代码和/data 中的 YAML 数据,游戏需要时加载。我想让数据文件包含基本脚本,主要是在事件/观察者模型中。但是,我也希望用户能够生成和共享自定义场景,而不必担心脚本中嵌入了恶意代码。

附录:我最初的计划是将用户创建的内容分为两种类型,“模块”是仅数据(因此安全)和添加额外功能的插件(但显然是不安全)。类比桌面游戏,模块就像发布的冒险场景和内容,插件就像包含额外规则和系统的规则手册。

示例脚本(语法当然会根据解决方案而改变):

---
Location:
observers:
on_door_open: |
monster = spawn_monster(:goblin);
monster.add_item(random_item());
monster.hostile = true;

从安全的角度来看,如果脚本是严格选择加入的,那将是理想的,可能是通过一个带有一点 DSL 的包含的 mixin,例如:

class Frog
include Scriptable

def jump; ... ; end # this can be called from a script
allow_scripting :jump

def ribbit; ... ; end # this cannot be called from a script
end

我已经查看了三个四个选项,但我不确定哪个是最好的方法:

  1. 使用 Ruby 脚本,但在某种沙箱中。

    优点:非常熟悉 Ruby,不需要“胶水”代码或在语言之间集成对象的问题。

    缺点:对安全问题或沙箱不是很熟悉,没有找到任何似乎合适的现成解决方案。

  2. 实现 嵌入另一种脚本语言,例如Lua.

    优点:Ruby 和 Lua 是基于 C 的,因此绑定(bind)应该相当简单。 Lua 是一种相当流行的语言,所以如果我以后遇到问题,可以提供帮助。安全,因为我没有专门绑定(bind)的任何功能都无法从脚本中使用。

    缺点:现有的 Ruby-Lua 绑定(bind)似乎是单向的、陈旧且维护不善,或者两者兼而有之。将一种脚本语言嵌入另一种脚本语言似乎有点狡猾。

  3. 使用 Ruby 解释器实现自定义脚本语言。我一直在试验 Treetop ,并且编写一个足以满足脚本需求的简单语法应该不会太难。

    优点:无需嵌入其他语言。只有我专门实现的功能才可用于脚本。

    缺点:矫枉过正。 “这里不建”综合症。可能会出现可怕的错误巢穴。

  4. 使用特定领域的语言,完全用 Ruby 实现数据文件。

    优点:简单易行。

    缺点:没有用户创建的数据是可信的。

我也愿意接受我可能没有想到但不在该列表中的其他建议。安全实现嵌入数据文件的脚本的最佳解决方案是什么?

编辑 2011 年 12 月 23 日: 使用 DSL 添加了第四个选项,在顶部添加了“附录”以及其他想法/上下文。

最佳答案

您可以考虑使用 Shikashi gem ,它允许您创建沙箱并定义允许对单个对象进行方法调用的白名单。

关于Ruby 沙盒与集成脚本语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8619422/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com