2010-01-11 105 views
16

我想讓我的用戶創建Ruby腳本來對駐留在Web服務器上的一些數據進行計算,然後輸出結果。腳本在服務器上執行。有什麼辦法可以安全地做到這一點?在Web服務器上執行用戶提供的ruby代碼

更具體而言,我想:

  • 限制的資源腳本可以使用(存儲器和CPU),並限制其運行時間
  • 限制腳本可以使用哪個核心類(例如字符串,Fixnum對象,浮動,數學等)
  • 讓腳本訪問和返回數據
  • 輸出任何錯誤給用戶

是否有任何圖書館或項目能夠滿足我的要求?如果不是在Ruby中,也許是其他語言?

回答

17

您可以使用「白板」作爲一種清潔的房間,並在其中設置safe level至4

一張白紙你剝去所有方法的對象沙箱:

class BlankSlate 

    instance_methods.each do |name| 
    class_eval do 
     unless name =~ /^__|^instance_eval$|^binding$|^object_id$/ 
     undef_method name 
     end 
    end 
    end 

end 

潔淨室是其中上下文您評估其他代碼的對象:

clean_room = BlankSlate.new 

來自非置信源讀取的命令,則解除污染它。除非未知,否則Ruby將拒絕評估沙箱中的字符串。

command = gets 
    command.untaint 

現在在沙箱中執行該字符串,將安全級別提高到最高。 proc結束時,$ SAFE等級將恢復正常。我們在無塵室的綁定環境中執行命令,以便它只能看到潔淨室可以看到的方法和變量(請記住,像任何對象一樣,潔淨室可以在全局範圍內看到任何東西)。

result = proc do 
    $SAFE = 4 
    clean_room.instance_eval do 
     binding 
    end.eval(command) 
    end.call 

打印結果:

p result 
+0

看起來像什麼,我一直在尋找。謝謝。 – nolk 2010-01-12 05:42:07

+0

只是好奇 - 爲什麼在這裏'instance_eval'而不是隻調用'clean_room.binding.eval(command)'? – 2012-05-01 19:32:39

+1

@Matt,#綁定是私人的,所以你必須使用一些「富」才能得到它。 – 2012-05-02 10:17:58

相關問題