您可以使用「白板」作爲一種清潔的房間,並在其中設置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
看起來像什麼,我一直在尋找。謝謝。 – nolk 2010-01-12 05:42:07
只是好奇 - 爲什麼在這裏'instance_eval'而不是隻調用'clean_room.binding.eval(command)'? – 2012-05-01 19:32:39
@Matt,#綁定是私人的,所以你必須使用一些「富」才能得到它。 – 2012-05-02 10:17:58