2011-12-23 90 views
15

我目前正在研究Ruby中的基於文本的遊戲引擎,應用程序分爲Ruby代碼和/數據中的/ lib和YAML數據,在遊戲需要時加載。我想允許數據文件包含基本腳本,主要是在事件/觀察者模型中。不過,我也希望用戶能夠生成和共享自定義場景,而不必擔心嵌入腳本中的惡意代碼。我最初的計劃是將用戶創建的內容分爲兩種類型,「模塊」是僅數據(因此是安全的)和插件,增加了額外的功能(但顯然不安全)。爲了類比桌面遊戲,模塊將像發佈的冒險場景和內容一樣,插件將是包含附加規則和系統的規則手冊。Ruby沙盒與集成腳本語言

示例腳本(當然受到的語法更改基於溶液):

--- 
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 

我已經看了四個選項,但我不知道這是採取最好的方法:

  1. 使用Ruby腳本,但在某種沙箱中。

    優點:非常熟悉Ruby,不需要「粘合」代碼或在語言之間集成對象的問題。

    缺點:不太熟悉安全問題或沙盒,還沒有找到任何似乎適合的現成解決方案。

  2. 實現嵌入另一種腳本語言,例如, Lua中。

    優點: Ruby和Lua是基於C的,因此綁定應該相當簡單。 Lua是一種非常流行的語言,如果我稍後遇到問題,可以提供幫助。安全,因爲我沒有特別綁定的任何功能將不可用於腳本。

    缺點:現有的Ruby-Lua綁定似乎是單向的,老的和維護不當的,或者兩者兼而有之。將腳本語言嵌入到另一種腳本語言中看起來很狡猾。

  3. 使用Ruby解釋器實現自定義腳本語言。我一直在做Treetop的實驗,並且製作一個足以處理腳本的簡單語法應該不會太難。

    優點:無需嵌入其他語言。只有我特別實現的功能才能用於腳本。

    缺點:矯枉過正。 「不在此建」綜合徵。可能發生的可怕的錯誤巢等待發生。

  4. 使用特定領域的語言完全在Ruby中實現數據文件。

    優點:簡單而簡單。

    缺點:沒有用戶創建的數據是可信的。

我也開放給其他建議,不在列表中,我可能沒有想到。安全地實現嵌入數據文件中的腳本的最佳解決方案是什麼?

編輯2011年12月23日:添加了DSL的第四個選項,在頂部添加了「addendum」以及其他想法/上下文。

+0

嗯,我不是很熟悉遊戲腳本,但爲什麼不使用V8和Javascript?它閃電般快速,大多數人都會很喜歡JS的工作。 – omninonsense 2011-12-23 19:53:03

+0

大家節日快樂! – 2011-12-25 20:35:23

+1

這真的取決於你想達到什麼,如果插件是在ruby中,很難阻止其中一個重新打開一個核心類,並以同樣的方式做任何他們想做的事情,一個Ruby插件可以做任何事情。除了使用任何其他語言作爲插件語言是矯枉過正之外,你會做比它更多的工作;) – Schmurfy 2011-12-26 15:38:14

回答

4

您可能會考慮使用Shikashi gem,它允許您創建沙箱併爲單個對象定義允許的方法調用白名單。

+0

Shikashi看起來很有趣,更符合我在這裏的初衷。你(有沒有人)有任何經驗,戰爭故事,技巧或一般性評論? – 2012-01-03 08:18:58

+0

被選爲答案,因爲它最好地回答了我原先想到的問題。 – 2012-01-17 22:52:18

+0

Shikashi gem是否可以使用Rails 5 beta ruby​​ 2.3?這不是爲我安裝。 – abrocks 2016-02-20 19:16:16

1

考慮使用jRuby而不是Ruby。 Java最初是爲了支持移動代碼而實施的(回到機頂盒時代),並且有一個經過良好測試的security model/implementation,我懷疑它可以包裝足夠的jRuby來保持用戶腳本/類不會對遊戲系統的其他部分造成破壞。 jRuby同樣支持embedding,這可能有助於將遊戲內核與用戶應用程序分開,但我不知道它目前有多強大。

而且,當然,jRuby是Ruby!

+0

jruby的好主意。但是我使用jruby&jsr 223所做的測試並不真正成功(變量傳遞)。希望這將在未來發生改變。 – plang 2012-02-21 09:37:01

+0

除了這個事實(並且我意識到在時間或我的評論中我還有另外兩年的好處),那個Java已經變成了充滿沙盒的安全漏洞。當然,這不是一個真正的Java問題 - 在自己的機器上運行的代碼的安全性是一個信任的噩夢,因爲它最終歸結爲對其他程序員的信任。信任沙盒,因爲它被廣告爲沙盒也許比不信任任何人更好,但它仍然是信任。 – jefflunt 2014-03-10 20:32:18