当前位置: 首页 > 知识库问答 >
问题:

如何阻止Nashorn允许quit()函数?

那昊
2023-03-14

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

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

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

向下滚动至“Additional Nashorn Build-in Functions”(其他Nashorn内置函数),然后查看“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类的子集。

有什么方法可以防止这种行为吗?如何防止用户运行任何附加功能?

共有2个答案

苏志
2023-03-14

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

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

万俟招
2023-03-14

不幸的是,目前无法控制非标准全局函数的创建。一种解决方法是,在初始化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,那么一个简单的删除退出 即可。

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

 类似资料:
  • 问题内容: 我使用下面的代码作为示例菜单。 当我在IE浏览器中运行以上代码时,它显示页面顶部(URL栏下方),例如 “为了帮助保护您的安全,Internet Explorer限制了该网页的运行脚本或Activex控件,这些脚本或Activex控件可以访问您的计算机。单击查看选项。” 当我右键单击并单击允许的被阻止内容时,它会运行。但是我想要没有此弹出消息,我需要运行代码…如何自动运行此代码? 问题

  • TL;dr:如何在没有随机文本的情况下将无符号32位整数转换为chars/uint8_t 好的,我愿意为此牺牲几个声誉点。我需要快速将一个4字节的无符号整数转换为数组字节,以便读取/写入/操作我自己结构的二进制文件。 这样我就可以读取一个结构,然后将其用作对象,而不是读取它,为每个更改写入它。 但是当我尝试实现一个函数时,我得到了一个泄漏。指针只是不断在函数范围之外添加值。 主要: 和输出: 在我

  • 我使用从使用API的ReactJS发送数据,我得到一个错误: 以下是错误: CORS策略已阻止从来源“http://localhost/2019/EURDU/user_controllers/userregistercontroller/userregistration”访问位于“http://localhost:3000”的XMLHttpRequest:飞行前响应中的access-control

  • 问题内容: Ajax使用回调,因为它是同步的。 我希望对远程URL块的调用直到出现一些答案为止 ,就像在Ajax中一样,但是没有异步部分,或者我要说要进行JAX调用。 是否有任何技术可以使以下事情发生(使用JQuery)(…使用JQuery或其他解决方案): 我只是想知道-想学习。 实际上,有时会阻塞直到回复合适为止。我并不是说要浏览器阻止,而只是脚本运行时。 问题答案: 您可以在使用jQuery

  • 我正在工作的一个项目与SpringbootReactJS和MongoDB。我已经实现了整个代码,但它没有从数据库导入数据。它显示了以下错误。 访问位于“”的XMLHttpRequesthttp://localhost:8080/api/auth/file“起源”http://localhost:8081'已被CORS策略阻止:请求的资源上不存在'Access Control Allow Origi