Ruby沙箱与集成脚本语言相结合

前端之家收集整理的这篇文章主要介绍了Ruby沙箱与集成脚本语言相结合前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我目前正在使用 Ruby中的基于文本的游戏引擎,将应用程序分为/ lib中的Ruby代码和/ data中的YAML数据,在游戏需要时加载.我想允许数据文件包含基本脚本,主要是在事件/观察者模型中.但是,我也希望用户能够生成和共享自定义场景,而无需担心脚本中嵌入的恶意代码.

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

示例脚本(当然可以根据解决方案更改语法):

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

从安全的角度来看,如果脚本严格选择加入,那么这可能是理想的,可能是通过一个包含在DSL中的混合,例如:

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

我看了三个四个选项,但我不知道最好的方法是:

>使用Ruby脚本,但在某种沙盒中.

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

缺点:不太熟悉安全问题或沙箱,还没有找到任何似乎适合的开箱即用的解决方案.
>实现嵌入另一个脚本语言,例如Lua中.

优点:Ruby和Lua是基于C的,所以绑定应该相当简单. Lua是一种相当流行的语言,所以如果我以后遇到问题,可以提供帮助.安全,因为我没有特别绑定的任何功能将不可用于脚本.

缺点:现有的Ruby-Lua绑定似乎是单向的,旧的,维护不良的,或者两者都是.似乎是一种狡猾的诡计,将脚本语言嵌入另一种脚本语言.
使用Ruby解释器实现自定义脚本语言.我一直在尝试使用Treetop,而不应该是一个简单的语法,这对于脚本来说就足够了.

优点:不需要嵌入另一种语言.我已经专门实现的功能将可用于脚本.

缺点:过度杀伤“不建在这里”综合症.大概可怕的虫巢等待发生.
>使用特定于领域的语言完全使用Ruby实现数据文件.

优点:简单易用.

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

我也可以接受其他建议,而不是我可能没有想到的那个清单.安全地实现嵌入在数据文件中的脚本的最佳解决方案是什么?

编辑2011年12月23日:添加了第四个选项与DSL,添加“附录”在顶部与额外的想法/上下文.

解决方法

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

猜你在找的Ruby相关文章