JRuby DSL封装,不包括标准库

时间:2013-12-04 18:01:28

标签: java ruby security jruby dsl

我正在尝试创建一个Java程序,允许用户使用我编写的Ruby DSL进行一些有限的脚本编写。用户编写的脚本将保存到JRuby中的Proc对象中。问题出现在用户仍然可以访问Ruby标准的方法,例如File.new,或者创建类,或者基本上搞乱程序或计算机的其他内部逻辑。

有没有办法使用JRuby或Ruby甚至Java将用户的脚本限制为仅限于DSL的约束?或者至少删除用户对某些类的访问权限?

1 个答案:

答案 0 :(得分:0)

由于您在JRuby下运行,因此可以使用Java security policypolicy file documentation)来防止用户执行文件或网络I / O等操作。当然,这也会使您的代码无法拥有这些功能!您可以通过jar URI或jar签名将代码列入白名单,因此一种策略是创建可信代码的“外壳”,强烈验证其输入,将其打包在自己的jar中,信任它,并专门用于您自己的代码。这样做很快就会变得复杂(有一个广泛的测试套件!),但它可以完成。

要明确控制DSL可用的命名空间,可以使用BasicObject。它不会混合Kernel或标准Ruby命名空间中可用的任何其他内容。但是,这不会为您提供安全,因为用户仍然可以直接使用::Fileinclude ::Kernel将其全部收回!