Ruby:创建一个沙盒评估?

时间:2011-05-20 16:26:24

标签: ruby-on-rails ruby eval sandbox

我的Rails应用程序有关于何时应在页面上显示一些内容的复杂规则。我决定通过在Ruby中编写谓词(简单的“是/否”函数)并将它们存储在数据库中以便随后进行评估来实现这一点。这很简单。

我主要担心的是安全问题:如果恶意某人弄清楚如何写入数据库,他们可能会在数据库中粘贴任意Ruby代码,然后“所有基础都属于我们”。

那么是否可以创建一个“沙盒”eval,例如,删除了所有IO操作?

4 个答案:

答案 0 :(得分:6)

您可能想要检查“污点”方法和相关内容。这是一个很好的参考:

http://ruby-doc.com/docs/ProgrammingRuby/html/taint.html

尽管如此,我不能建议你不要存储代码并对其进行评估,这是一个应该避免的安全风险,而且大多数情况下都有一种解决问题的简单方法。

如果您需要评估复杂的规则和谓词,我建议使用规则引擎来创建一个不错的DSL。没有在红宝石中使用过,但这个对我来说很好看:

http://treetop.rubyforge.org/index.html

干杯

答案 1 :(得分:6)

你可以使用沙盒宝石https://github.com/tario/shikashi来做到这一点,它允许你将方法列入白名单。
归功于https://stackoverflow.com/a/8704768/188355

答案 2 :(得分:5)

假设你至少打开了ruby 1.8,你可以在不同的安全级别运行一个proc。

def my_unsafe_function
  # possible unsafe stuff
end

proc {
  $SAFE = 4  # change level only inside this proc
  my_unsafe_function
}.call

但是,您应该重新考虑是否确实需要在数据库中存储ruby代码。该应用的用户是否会修改此存储的代码,为什么?如果不是,为什么不把代码放在应用程序的文件中呢?我不知道你的设置,但应该可以将逻辑移出数据库。

答案 3 :(得分:0)

如果要从对象中删除某些方法,可以查看:
remove_methodundef_method