必须将预定义的一组对象聚合到一个新对象中。但是我希望用户为此指定一个自定义函数。
现在天真的做法是
def foo; end
objects = [1,2,3]
# result = eval(user_script)
result = eval("objects.inject {|sum, n| sum + n }")
我显然不想做什么!我读到了$SAFE = 4
(请参阅here),但我不确定这是否足够。特别是因为用户定义的脚本仍然可以调用其他函数,如foo
。我只想允许访问基本的非危险Ruby核心功能。
Ruby是否有允许安全执行用户定义脚本的工具?我不需要是Ruby语法。不过,这会很好。
答案 0 :(得分:2)
你见过Sven Fuch的安全模式插件(overview here)吗?这是GitHub上的page。
它不会将$ SAFE所做的危险方法列入黑名单,而是解析传入的代码并删除不在白名单上的任何方法。该插件附带预定义的白名单,可在this file中看到。
我个人从未使用过此插件,但作者在Ruby社区中很活跃,我确信他会回答你提出的任何问题。
答案 1 :(得分:0)
如果你选择给世界上的每个人提供钥匙,那么世界上最好的锁将不会阻止你被抢劫。