2010-04-03 91 views
8

我意識到這聽起來有點瘋狂,但我正在爲一個項目工作,我需要一個服務器來運行用戶提供的Ruby代碼並返回結果。如何安全地讓用戶運行任意的Ruby代碼?

我期待,以防止這樣的事情:

system("rm -rf /") 
eval("something_evil") 
# etc... 

我敢肯定,必須有一些合理的安全做到這一點的方式,因爲它已經在像tryruby.org的地方存在。任何幫助非常感謝,謝謝!

回答

6

三點建議:

1)看看紅寶石taint levels。這提供了一定程度的打擊,eval('evil_code')類的東西保護等

2)除非用戶的實際需要訪問本地文件系統,使用類似fakefs

3)不管你做什麼其他follow Tronic's suggestion(可是一個痛苦的設置,但有限的chroot監獄是確保用戶無法訪問你不明確希望他們訪問的資源的唯一方法。)

3

以最少chroot的資源限制(內存使用情況等)作爲用戶/組nobody,以允許的syscalls白名單運行程序。

2

「空白石板」是剝離了其大部分方法的對象。 「潔淨室」是您評估潛在不安全房間的對象。 如果您在「潔淨室」中評估代碼,該代碼也是「空白石板」,將安全級別調高至最高,您將爲自己提供很大的保護。沒有什麼安全是可以肯定的,所以這應該被視爲你的安全層,不一定只是層。

This answer shows how to do it

0

我有同樣的問題,但隨後遇到了eval.so,並決定爲它編寫一個API包裝器,名爲Sandie。它是那麼容易,因爲:

sandie = Sandie.new(language: 'ruby') 
# => #<Sandie:0x00000002e30650> 
sandie.evaluate(code: 'puts "hello world"') 
# => {"stdout"=>"hello world\n", "stderr"=>"", "wallTime"=>487, "exitCode"=>0} 

它還支持一大堆其他語言,以及如C#,Perl和Lua中,和Java。

相關問題