安全 运行 java java 中的脚本代码
Safely running javascript code in java
如果标题不清楚,我很抱歉,因为我不知道所有的术语,所以请耐心等待。
所以我正在尝试为 运行 在 Java 应用程序中的任何 Java 脚本代码创建一个受控环境。注意:代码是由用户创建的,因此我必须 block/prevent 代码专门尝试 access/modify java 不应触及的变量。 (最好通过抛出编译错误来反馈用户)
编辑 1:顺便说一句,我尝试使用 Rhino 和 Nashorn。
这是一个简单的例子。
public class ScriptRunner{
public Foo foo=new Foo();
//this is not supposed to be accessed by the script
public int money=0;
public Object run(){
return compiler.compile(STRING START (obtained from a file)
function main(someObject){
//this is not allowed
someObject.money=10000000000000000000000;
//or this
var someBlacklistedJavaObject=.....
someBlacklistedJavaObject.someFuncton();
//but this is allowed
someObject.foo.name="Bob";
return someObject.foo.someFunction();
}
STRING END).run("main",this);
}
}
我也不确定这是否是可能的解决方案之一,但我不能使用内置的 java 安全性 class,因为一些无法访问的代码实现了它并且不允许将安全性 object 设置为任何其他值。
我想到的是,一个简单的实现是在某些包中创建包装器 Java classes。比检查脚本中的 java object 是否没有该路径并抛出错误。但问题是我不知道该怎么做。
这是我正在尝试做的事情的简单可视化。
编辑 2:希望保持较低的 Java 兼容性配置文件,但这不是 100% 必要的。
在 Nashorn 中使用 ClassFilter(注意:需要 Java >= 1.8。0_40)
如果标题不清楚,我很抱歉,因为我不知道所有的术语,所以请耐心等待。
所以我正在尝试为 运行 在 Java 应用程序中的任何 Java 脚本代码创建一个受控环境。注意:代码是由用户创建的,因此我必须 block/prevent 代码专门尝试 access/modify java 不应触及的变量。 (最好通过抛出编译错误来反馈用户)
编辑 1:顺便说一句,我尝试使用 Rhino 和 Nashorn。
这是一个简单的例子。
public class ScriptRunner{
public Foo foo=new Foo();
//this is not supposed to be accessed by the script
public int money=0;
public Object run(){
return compiler.compile(STRING START (obtained from a file)
function main(someObject){
//this is not allowed
someObject.money=10000000000000000000000;
//or this
var someBlacklistedJavaObject=.....
someBlacklistedJavaObject.someFuncton();
//but this is allowed
someObject.foo.name="Bob";
return someObject.foo.someFunction();
}
STRING END).run("main",this);
}
}
我也不确定这是否是可能的解决方案之一,但我不能使用内置的 java 安全性 class,因为一些无法访问的代码实现了它并且不允许将安全性 object 设置为任何其他值。
我想到的是,一个简单的实现是在某些包中创建包装器 Java classes。比检查脚本中的 java object 是否没有该路径并抛出错误。但问题是我不知道该怎么做。
这是我正在尝试做的事情的简单可视化。
编辑 2:希望保持较低的 Java 兼容性配置文件,但这不是 100% 必要的。
在 Nashorn 中使用 ClassFilter(注意:需要 Java >= 1.8。0_40)