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

嵌入式Nashorn-沙盒执行

徐奇逸
2023-03-14

我想得到一个关于如何在Java应用程序中沙箱执行Nashorn的明确答案。

我见过“类似的问题”(我将提及),但最终没有一个答案能够解决我的担忧。

让我从定义开始。

假设我们从这里开始:

ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
engine.put("map",new HashMap()); 
engine.eval(jsCode); // jsCode can access 'map' only.

我所说的“沙盒”是指确保JavaScript不得访问任何java对象,除了在范围中添加的对象。

所以下面的评估应该没问题。

engine.eval("map.toString()"); 
engine.eval("map.size()"); 
engine.eval("map.put('name','jeff'); "); 
engine.eval("map.getClass()"); 

但以下评估不会:

engine.eval("var m = new java.util.HashMap();"); // <-- stop accessing Java
engine.eval("map.getClass().forName('java.io.File'); "); // stop. it's trying to be sneaky

最后,我不担心这一点:

engine.eval("while(1) {;}"); // this is impossible to detect. Maybe it's possible for this simple case... but sneaky users could make it impossible to detect... anyway this is not what I am asking. I am only concerned on accessing java objects.

因此,通过沙盒,我打算阻止jsCode访问我没有定义的java对象。

我发现这可能是一个潜在的解决方案:

jdk.nashorn.api.scripting.NashornScriptEngineFactory factory = new  jdk.nashorn.api.scripting.NashornScriptEngineFactory();
ScriptEngine engine = factory.getScriptEngine(new jdk.nashorn.api.scripting.ClassFilter() {

    public boolean exposeToScripts(String s) {
        return false;
    }

});

但是直接访问以jdk.*开头的包“安全”吗?

我看到的另一种方法更为神秘:

final ScriptEngine engine = 
   new NashornScriptEngineFactory().getScriptEngine(new String[] { "--no-java" }); 

我在这里看到了一个:安全地重复使用沙盒Nashorn容器

有人能告诉我吗?

共有1个答案

穆建华
2023-03-14

您可以使用jdk。纳肖恩。应用程序编程接口。脚本编制。*API,如果这对您的应用程序有帮助的话。同样的javadoc也在这里-

是的,--no-java是防止脚本代码访问java包的选项。

 类似资料:
  • 问题内容: Java应该没有内存泄漏,但是仍然可能。当我的程序出现内存泄漏时,我可以修复它(我希望)。但是,当某些第三方程序包具备该功能时,我该怎么办?几乎什么都没有,除非不使用此软件包。 还有其他解决方案吗?我喜欢沙盒的想法。您被允许在某个区域内做任何您想做的事情,而您的“身体上的”没有能力打扰其他人。有没有办法为Java中的内存使用创建此类沙箱?想象一下=创建用于内存使用的沙箱,允许某些程序包

  • 创建一个渲染器可运行于 Chromium OS 沙盒中的浏览器窗口. 启用此选项后,渲染器必须通过IPC与主进程进行通信才能访问Node API。同时,为了使Chromium OS沙盒可运行,electron 必须使用 --enable-sandbox命令行参数运行。 Chromium主要的安全功能之一是所有Blink渲染或JavaScript都运行在沙盒中,该沙盒使用了特定于操作系统的功能以确保

  • MIP 以浏览体验与加载速度为优先考量点,因此在组件开发的时候,MIP 只开放了部分原生 JS 供组件开发者使用,以尽量避免组件开发出有悖 MIP 站点体验的组件。这个实现部分开放原生 JS API 的机制就是 MIP 的加载机制。 部分开放的 JS API MIP 鼓励使用 JS 进行计算,进行逻辑实现等等。因此这类工具型 API、数据结构对象等等具有完全的功能,比如 Math.*、Array、

  • Chromium的一个关键安全特性是,进程可以在沙盒中执行。 沙盒通过限制对大多数系统资源的访问来减少恶意代码可能造成的伤害 — 沙盒化的进程只能自由使用CPU周期和内存。 为了执行需要额外权限的操作,沙盒处的进程通过专用通信渠道将任务下放给更大权限的进程。 在Chromium中,沙盒化应用于主进程以外的大多数进程。 其中包括渲染器进程,以及功能性进程,如音频服务、GPU 服务和网络服务。 查阅C

  • 问题内容: 不确定我做错了什么,我认为通过添加边框框,它可以很好地适合这四个框。 问题答案: 问题在于,默认情况下,元素会渲染一些额外的空间。 为什么?因为设置为具有某些内联元素特征。 元素之间的空格或换行符将导致浏览器呈现一个空间。 同样,如果您要在元素中编写文本,则每次按下空格键或添加换行符时,浏览器都会呈现一个空格。 此规则适用于div。源中的空格或换行符将导致渲染空间。这会产生意外的宽度,

  • 我在项目的下的静态文件夹中放置了一些静态资源,例如。我们使用的库希望通过执行使用servlet上下文加载一些资源。 当我在Eclipse中运行这个项目时,的真实路径解析为。我不知道为什么它使用这个文件夹,而它不存在于项目中?如果我创建了可执行jar并运行它,那么给出。这个目录确实存在,但里面什么也没有。 很明显,如果通过HTTP请求,我可以很好地看到我的资源,但通过servlet上下文,我不能像预