Ruby:创建一个沙盒评估版?

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

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

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

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

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

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

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

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

干杯

你可以使用沙盒gemhttps://github.com/tario/shikashi ,它允许你将方法列入白名单。
信用到https://stackoverflow.com/a/8704768/188355

假设你至少打开了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代码。 该应用的用户是否会修改此存储的代码,为什么? 如果不是,为什么不将代码放在应用程序的文件中呢? 我不知道你的设置,但应该可以将逻辑移出数据库。

如果要从对象中删除某些方法,可以检查以下内容:
remove_method或undef_method