【问题标题】:Safely running javascript code in java在java中安全运行javascript代码
【发布时间】:2016-07-19 17:17:52
【问题描述】:

对不起,如果这个标题不清楚,因为我不知道所有的术语,所以请多多包涵。

所以我正在尝试创建一个受控环境来在 Java 应用程序中运行任何 JavaScript 代码。注意:代码是由用户创建的,所以我必须阻止/阻止专门尝试访问/修改不应该到达的 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 安全类。

我想到的是,一个简单的实现是在某个包中创建包装 Java 类。比检查脚本中的 java 对象是否没有该路径并引发错误。但问题是我不知道该怎么做。

这是我正在尝试做的简单可视化。

编辑 2:保持较低的 Java 兼容性配置文件是可取的,但这不是 100% 必要的。

【问题讨论】:

  • 你看过Nashorn吗?
  • 是的,我做到了。我尝试的一切都给了我一个错误,即 Nashorn 的类不存在或无权访问。

标签: javascript java rhino


【解决方案1】:

在 Nashorn 中使用 ClassFilter(注意:需要 Java >= 1.8.0_40)

【讨论】:

  • 谢谢!我不知道,但我的代码的理想特征之一是它与低 Java 版本兼容。因此,如果有人指出任何其他解决方案,我将不胜感激。 :) 但如果没有其他办法,我猜这可行。
  • 好的,好吧... Nashorn 仅与 Java 8 一起发布,因此如果您需要支持较低的主要 Java 版本,您必须查看 Rhino 的 ClassShutter - 但快速谷歌表明这不是最强大/最安全的选择。
  • 谢谢。生病做一些研究。
  • 是的,不幸的是,你是对的......谢谢你帮助我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
  • 2016-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多