首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在web服务器上执行用户提供的ruby代码

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

Stack Overflow用户
提问于 2010-01-12 06:10:16
回答 1查看 1.3K关注 0票数 16

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

更具体地说,我想:

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-01-12 09:22:49

您可以使用“空白板”作为净室,并使用沙箱将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是一个对象,您可以在其中评估其他代码:

  clean_room = BlankSlate.new

从不受信任的来源读取命令,然后将其清除。除非未被污染,否则Ruby将拒绝对沙箱中的字符串求值。

  command = gets
  command.untaint

现在在沙箱中执行字符串,将安全级别提高到最高。当过程结束时,$SAFE级别将恢复正常。我们在净室绑定的上下文中执行该命令,以便它只能看到净室可以看到的方法和变量(但请记住,像任何对象一样,净室可以看到全局场景中的任何内容)。

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

打印结果:

  p result
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2045324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档