2

一组预定义的对象必须聚合成一个新对象。但是我希望用户为此指定一个自定义函数。

现在天真的方法是

def foo; end

objects = [1,2,3]
# result = eval(user_script)
result = eval("objects.inject {|sum, n| sum + n }")

显然不想做什么!我读过$SAFE = 4(见这里),但我不确定这是否足够。特别是因为用户定义的脚本仍然可以调用其他函数,例如foo. 我只想允许访问基本的非危险 Ruby 核心功能。

Ruby 是否有任何工具可以安全地执行用户定义的脚本?我不需要是 Ruby 语法。不过,这会很好。

4

2 回答 2

2

你看过 Sven Fuch 的安全模式插件?这是 GitHub 上的页面

它不是像 $SAFE 那样将危险方法列入黑名单,而是解析传入的代码并删除任何不在白名单上的方法。该插件带有一个预定义的白名单,可以在这个文件中看到。

我个人从未使用过这个插件,但作者在 Ruby 社区很活跃,我相信他会回答你提出的任何问题。

于 2009-10-18T17:55:51.730 回答
0

如果您选择将钥匙交给世界上的每个人,世界上最好的锁也不会阻止您被偷盲。

于 2009-10-18T17:22:39.810 回答