在Web服务器上执行用户提供的ruby代码

我想让我的用户创建Ruby脚本,对驻留在Web服务器上的某些数据进行计算,然后输出结果。 脚本在服务器上执行。 有没有办法安全地做到这一点?

更具体地说,我想:

  • 限制脚本可以使用的资源(内存和CPU),并限制其运行时间
  • 限制脚本可以使用的核心类(例如String,Fixnum,Float,Math等)
  • 让脚本访问并返回数据
  • 输出任何错误给用户

是否有任何图书馆或项目可以满足我的要求? 如果不是在Ruby中,也许还有其他语言?

您可以使用“空白平板”作为洁净室,并使用沙箱将安全级别设置为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