fea*_*ool 21 ruby eval ruby-on-rails sandbox
我的Rails应用程序有关于何时应在页面上显示一些内容的复杂规则.我决定通过在Ruby中编写谓词(简单的"是/否"函数)并将它们存储在数据库中以便随后进行评估来实现这一点.这很简单.
我主要担心的是安全性:如果恶意某人弄清楚如何写入数据库,他们可能会在数据库中粘贴任意Ruby代码,然后" 所有基础都属于我们 ".
那么是否可以创建一个"沙盒"eval,例如,删除了所有IO操作?
您可能想要检查"污点"方法和相关的东西.这是一个很好的参考:
http://ruby-doc.com/docs/ProgrammingRuby/html/taint.html
尽管如此,我无法建议您不要存储代码并对其进行评估,这是一个应该避免的安全风险,而且大多数时候都有一种解决问题的简单方法.
如果您需要评估复杂的规则和谓词,我建议使用规则引擎来创建一个不错的DSL.没有在红宝石中使用过,但这个对我来说很好看:
http://treetop.rubyforge.org/index.html
干杯
假设你至少打开了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代码.该应用的用户是否会修改此存储的代码,为什么?如果不是,为什么不把代码放在应用程序的文件中呢?我不知道你的设置,但应该可以将逻辑移出数据库.
| 归档时间: |
|
| 查看次数: |
7772 次 |
| 最近记录: |