Ruby:创建一个沙盒评估?

fea*_*ool 21 ruby eval ruby-on-rails sandbox

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

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

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

Pab*_*dez 6

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

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

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

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

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

干杯

  • 选中标记!我找到了[James Coglan的粘贴](https://github.com/jcoglan/stickup),这是一个使用Treetop编写的小型解析器,它只花了几个小时来学习它,扩展它并将它集成到我的应用程序中.是的,这比狡猾的$ SAFE更安全.谢谢你的轻推! (2认同)

Emi*_*kol 6

您可以使用沙盒宝石https://github.com/tario/shikashi,它允许您将方法列入白名单.
信用到/sf/answers/609333791/


Kel*_*vin 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
Run Code Online (Sandbox Code Playgroud)

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

  • 请记住,并非所有Ruby实现都完全实现安全(例如,JRuby不会将其视为高优先级),或者完美实现它([MRI有一个bug](http://www.ruby-lang.org)/EN /新闻/ 2011/02/18 /异常的方法,可以旁路安全/)). (2认同)