Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JRuby DSL封装,排除标准库_Java_Ruby_Security_Jruby_Dsl - Fatal编程技术网

Java JRuby DSL封装,排除标准库

Java JRuby DSL封装,排除标准库,java,ruby,security,jruby,dsl,Java,Ruby,Security,Jruby,Dsl,我正在尝试制作一个Java程序,允许用户使用我编写的Ruby DSL执行一些有限的脚本编写。用户编写的脚本保存到JRuby中的Proc对象中。问题在于用户仍然可以访问Ruby标准的方法,例如File.new,或者创建类,或者基本上扰乱程序或计算机的其他内部逻辑 有没有办法使用JRuby、Ruby甚至Java将用户脚本限制在DSL的约束范围内?或者至少要删除用户对某些类的访问权限?因为您在JRuby下运行,所以可以使用()来阻止用户执行文件或网络I/O之类的操作。当然,这也会阻止您的代码具有这些功

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


有没有办法使用JRuby、Ruby甚至Java将用户脚本限制在DSL的约束范围内?或者至少要删除用户对某些类的访问权限?

因为您在JRuby下运行,所以可以使用()来阻止用户执行文件或网络I/O之类的操作。当然,这也会阻止您的代码具有这些功能!您可以通过jar URI或jar签名将代码列入白名单,因此一种策略是创建一个受信任代码的“外壳”,对其输入进行强验证,将其打包到自己的jar中,信任它,并将其专门用于您自己的代码。正确地做这件事很快就会变得复杂(有一个广泛的测试套件!),但它是可以做到的


要对DSL可用的名称空间进行显式控制,可以使用。它不会混入
内核
或标准Ruby命名空间中的任何其他可用内容。不过,这并没有给您带来安全性,因为用户仍然可以直接使用
::File
include::Kernel
将其全部恢复

我不熟悉jruby,但似乎这个问题应该在别处解决。将Ruby用于DSL的最大优势是您可以使用Ruby!限制对非DSL功能的访问将有点违背这一点。如果要限制用户,请在更高级别上执行,例如限制加载脚本的程序的权限,使其无法创建文件。