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

如何在安全管理器下运行Java8的nashorn

邢新
2023-03-14

我正在寻找沙盒Java 8的Nashorn javascript引擎。我已经发现了--no-java标志,这很有帮助,但我还发现了以下链接,其中指出需要“在启用SecurityManager的情况下运行”:http://mail.openjdk.java.net/pipermail/nashorn-dev/2013-September/002010.html

我还没有找到留档说明如何与Nashorn一起完成,那么应该如何安全地完成呢?

共有3个答案

艾自强
2023-03-14

与java命令不同,似乎不可能通过设置java来启用安全管理器。安全jjs命令行上的manager属性。(这可能是一个bug。)但是,您可以从JavaScript调用Java API来启用安全管理器。在Java中,这是

System.setSecurityManager(new SecurityManager());

在JavaScript/Nashorn中,除了提供完全限定的类名之外,它几乎是一样的:

java.lang.System.setSecurityManager(new java.lang.SecurityManager())

(或者,您可以导入名称。)您可以将这一行放到应用程序脚本中,也可以将其放到应用程序脚本之前的jjs命令行中。

例子:

$ cat userhome.js
print(java.lang.System.getProperty("user.home"))
$ jjs userhome.js
/Users/xyzzy
$ cat secmgr.js
java.lang.System.setSecurityManager(new java.lang.SecurityManager())
$ jjs secmgr.js userhome.js
Exception in thread "main" java.security.AccessControlException: access denied ("java.util.PropertyPermission" "user.home" "read")
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:457)
    [...snip...]

但是,在命令行上设置策略文件确实有效:

$ cat all.policy
grant {
    permission java.security.AllPermission;
};
$ jjs -Djava.security.policy=all.policy secmgr.js userhome.js
/Users/xyzzy

或者,您可以在启用安全管理器之前添加等效的setProperty调用:

$ cat secmgr.js
java.lang.System.setProperty('java.security.policy', 'all.policy')
java.lang.System.setSecurityManager(new java.lang.SecurityManager())
朱睿
2023-03-14

可以使用启用安全管理器的jjs执行脚本。

jjs -J-Djava.security.manager myscript.js

jjs -J-Djava.security.manager

用于交互模式。请注意,如果您只使用-Djava。安全管理器,则该选项由jjs工具处理。要将选项传递给VM,必须使用-J前缀。除了启动工具“java”之外,任何其他JDK bin工具都是如此。

蒋联
2023-03-14

我知道你可能不再需要它了,但对于那些来到这里寻找在沙盒中运行nashorn的简单方法的人来说:如果你只是想阻止脚本使用反射,那么设置一个类过滤器。这样,您可以只允许使用一些可用的类。。。或者根本没有。

NashornScriptEngineFactory factory = new NashornScriptEngineFactory();
ScriptEngine scriptEngine = factory.getScriptEngine(
    new String[] { "--no-java" }, //a quick way to disable direct access to java API
    null, //a ClassLoader, let's just ignore it
    new ClassFilter() { //this one simply forbids use of any java classes, including reflection
        @Override
        public boolean exposeToScripts(String string) {
            return false;
        }
    }
);
 类似资料:
  • 即使我在Mule EE上运行,Mule Security Manager依赖性也没有得到解决。代码如下: http://www.mulesoft.org/schema/mule/spring-security http://www.mulesoft.org/schema/mule/spring-security/current/mule-spring-security.xsd http://www

  • 我有一个WildFly 10.1环境,我在其中使用以下配置启动容器: 当我没有指定参数时,实例启动,测试执行得很好;但是,当我使用安全管理器使用安全管理参数触发时,我得到以下异常: 我需要使用安全管理器来执行我的Arquillian测试用例,我不清楚在我的配置中会遗漏什么。 相关的毕业生图书馆是:

  • 有没有办法给管理servlet增加登录安全性? 似乎在V0.7中,您可以将以下两个添加到您的yaml文件中: 然而,我在最新版本(0.9.2)中尝试了,它给我一个错误,说:server.yaml有一个错误: 这是我拥有的:

  • 1. 前言 安全管理是软件系统必不可少的的功能。根据经典的 “墨菲定律”—— 凡是可能,总会发生。如果系统存在安全隐患,最终必然会出现问题。 本节就来演示下,如何使用 Spring Boot + Spring Security 开发前后端分离的权限管理功能。 2. Spring Security 用法简介 作为一个知名的安全管理框架, Spring Security 对安全管理功能的封装已经非常完

  • 我正在使用Spring Boot安全性和Oauth2。我不想禁用健康endpoint的安全性。 我可以完全禁用安全性,或者编写自己的实现并禁用autoconfigured One。 但是如何修改()的现有实现? 我试图创建自己的配置而不禁用AutoConfigurated一个,但由于冲突,这是不可能的。 以下是错误消息: 此外,我试图显式地为我自己的安全配置设置更高的顺序,但看起来自动配置的一个覆

  • 我正在使用故障保护(https://github.com/jhalterman/failsafe)作为我的重试逻辑框架,我想更多地了解故障保护的“运行”方法是如何工作的。 假设我有: 那么当运行时,是否会阻止MyMONt款额的执行?换句话说,是否会在所有重试完成之前执行?