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,不需要“粘合”代码或在语言之间集成对象的问题. 缺点:不太熟悉安全问题或沙箱,还没有找到任何似乎适合的开箱即用的解决方案. 优点:Ruby和Lua是基于C的,所以绑定应该相当简单. Lua是一种相当流行的语言,所以如果我以后遇到问题,可以提供帮助.安全,因为我没有特别绑定的任何功能将不可用于脚本. 缺点:现有的Ruby-Lua绑定似乎是单向的,旧的,维护不良的,或者两者都是.似乎是一种狡猾的诡计,将脚本语言嵌入另一种脚本语言. 优点:不需要嵌入另一种语言.我已经专门实现的功能将可用于脚本. 缺点:过度杀伤“不建在这里”综合症.大概可怕的虫巢等待发生. 优点:简单易用. 缺点:没有用户创建的数据是可信的. 我也可以接受其他建议,而不是我可能没有想到的那个清单.安全地实现嵌入在数据文件中的脚本的最佳解决方案是什么? 编辑2011年12月23日:添加了第四个选项与DSL,添加“附录”在顶部与额外的想法/上下文. 解决方法
您可以考虑使用
Shikashi gem,它允许您创建沙箱,并为单个对象定义允许的方法调用的白名单.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |