【问题标题】:Letting Nashorn run user code让 Nashorn 运行用户代码
【发布时间】:2018-02-15 15:25:42
【问题描述】:

我想知道是否可以正确保护 Nashorn(或任何其他脚本引擎)以确保运行用户代码的安全。这段代码的目的是让用户在应用程序的某些阶段执行操作,非常类似于 web 挂钩。我知道有一种方法可以阻止某些类从 Nashorn 内部访问,但是有没有办法通过反射绕过它?我将如何保护这些功能,或者这根本行不通?

【问题讨论】:

  • 这些出现了几次before你可以使用SecurityManager来控制什么可以执行和不可以执行

标签: java security java-8 webhooks nashorn


【解决方案1】:

您应该将放置在脚本环境中的对象限制为您的用户需要访问的对象,例如来自Oracle: Scripting for the Java Platform的对象

jsEngine.put("namesListKey", namesList);
System.out.println("Executing in script environment...");
  try {
    jsEngine.eval("var x;" +
                  "var names = namesListKey.toArray();" +
                  "for(x in names) {" +
                  "  println(names[x]);" +
                  "}" +
                  "namesListKey.add(\"Dana\");");
  } catch (ScriptException ex) {
      ex.printStackTrace();
  }
  System.out.println("Executing in Java environment...");
  for (String name: namesList) {
    System.out.println(name);
  }

在本例中,只有 namesListKey 可用于脚本,其他对象不可用。避免使用god 对象。

Thingworx 等应用程序实现了一个 Javascript 处理环境,允许访问应用程序对象的子集。

【讨论】:

  • 这会阻止通过反射访问吗?例如,这段代码不能访问Java.lang包并使用静态方法进行反射import(Java.lang.*)吗?这是取自您的同一个示例网站
  • 我认为这就是为什么您需要小心导入的内容
  • 是什么阻止用户将导入添加到他们的代码中?
猜你喜欢
  • 2019-02-02
  • 2018-12-23
  • 2015-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多