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

标签 ruby-on-rails ruby web-applications permissions

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

更具体地说,我想:

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

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

最佳答案

您可以使用“空白板”作为干净的房间,并使用沙箱来设置 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 级别将恢复正常。我们在洁净室绑定(bind)的上下文中执行命令,因此它只能看到洁净室可以看到的方法和变量(不过请记住,就像任何对象一样,洁净室可以看到全局范围内的任何东西)。

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

打印结果:

  p result

关于ruby-on-rails - 在 Web 服务器上执行用户提供的 ruby​​ 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2045324/

相关文章:

ruby-on-rails - 如何以编程方式连接到 Ruby 调试器以创建用于 Sublime Text 2 的插件?

ruby - Adobe Brackets 是否存在 slim 的语法荧光笔?

ruby-on-rails - 正则表达式允许 1-500 个字符

javascript - 单击另一个按钮后如何启用按钮jQuery

jquery - 字符串 "true"和 "false"为 bool 值

ruby-on-rails - Ruby on Rails,Running Guard,立即死亡 "Killed"

visual-studio - 找不到 "Use Custom Web Server"

sockets - web.whatsapp.com如何运作?

ruby-on-rails - 当我们必须使用 multipart : true in Rails

ruby - 工厂女郎 : Factory not registered: user (ArgumentError)