【问题标题】:How stop Nashorn from allowing the quit() function?如何阻止 Nashorn 允许使用 quit() 函数?
【发布时间】:2015-09-16 14:56:17
【问题描述】:

我正在尝试向我们的系统添加脚本功能,不受信任的用户可以编写简单的脚本并让它们在服务器端执行。我正在尝试使用 Nashorn 作为脚本引擎。

不幸的是,他们为 Nashorn 添加了一些非标准功能:

https://docs.oracle.com/javase/8/docs/technotes/guides/scripting/nashorn/shell.html#sthref29

向下滚动到“Additional Nashorn Built-in Functions”并查看“quit()”函数。是的,如果一个不受信任的用户运行这段代码,整个 JVM 就会关闭。

这很奇怪,因为 Nashorn 专门预计会运行不受信任的脚本。见:https://docs.oracle.com/javase/8/docs/technotes/guides/scripting/nashorn/api.html#classfilter_introduction

嵌入 Nashorn 的应用程序,尤其是服务器端 JavaScript 框架,通常必须从不受信任的来源运行脚本,并且 因此必须限制对 Java API 的访问。这些应用程序可以 实现 ClassFilter 接口以限制 Java 类访问 Java 类的子集。

有没有办法防止这种行为?如何阻止用户运行任何附加功能?

【问题讨论】:

  • 您绝对应该启动一个新进程来运行您不受信任的用户的代码。但也请看...stackoverflow.com/questions/24466203/…
  • 谢谢,这是一个非常有用的链接。但是那里没有停止退出()的选项。我试过 { "-strict", "--no-java", "--no-syntax-extensions", "--optimistic-types=true" } 和 quit() 仍然退出。

标签: nashorn


【解决方案1】:

很遗憾,目前无法控制非标准全局函数的创建。一种解决方法是在初始化 ScriptEngine 后从全局对象中删除这些函数:

final NashornScriptEngineFactory engineManager = new NashornScriptEngineFactory();
final ScriptEngine engine = engineManager.getScriptEngine();
final Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);
bindings.remove("print");
bindings.remove("load");
bindings.remove("loadWithNewGlobal");
bindings.remove("exit");
bindings.remove("quit");
System.err.println(engine.eval("'quit is ' + typeof quit"));

如果您使用的是 Nashorn shell,一个简单的 delete quit; 就可以了。

如果您使用 ScriptEngine 接口并创建多个绑定,则必须对创建的每个全局对象/绑定执行此操作。

【讨论】:

    【解决方案2】:

    如果您要运行“不受信任”的脚本,请在打开 SecurityManager 的情况下运行您的程序。随着那个“退出”会导致SecurityException。 ClassFilter 本身不能替代 SecurityManager。它用于与 SecurityManager 一起使用。请在此处查看 ClassFilter 上的 JEP:http://openjdk.java.net/jeps/202。 JEP 明确指出:

    让安全管理器对脚本来说是多余的。在评估来自不受信任来源的脚本之前,嵌入应用程序仍应打开安全管理。单独的类过滤不会提供完整的脚本“沙箱”。即使只执行不受信任的脚本(没有额外的 Java 类),仍应使用安全管理器。类过滤提供了比安全管理器提供的更精细的控制。例如,Nashorn 嵌入应用程序可能会阻止从脚本或安全管理器可能允许的其他资源密集型操作产生线程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-01
      • 2023-04-07
      相关资源
      最近更新 更多