【问题标题】:Nashorn NullPointerException with SecurityManagerNashorn NullPointerException 与 SecurityManager
【发布时间】:2014-12-08 15:04:51
【问题描述】:

我正在使用 nashorn js 解释器创建一个沙盒程序,并使用一个极简的安全管理器来限制它可以做什么。
问题是当我调用 engine.eval(reader) 时出现空指针异常。
我知道阅读器可以工作,因为我能够逐字打印整个文件。 我知道这是一个权限问题,因为如果我添加 AllPermissions 则一切正常。
那么在 nashorn 中运行脚本需要什么权限呢?

显然我搞砸了我最初的测试,不仅仅是文件阅读器,当我硬编码一个字符串时也会发生这种情况。

【问题讨论】:

    标签: java javascript permissions securitymanager nashorn


    【解决方案1】:

    我发现了问题。显然我需要这个权限才能运行 nashorn:

    java.io.FilePermission, "/usr/lib/jvm/java-8-openjdk/jre/lib/ext/nashorn.jar", "读取"

    【讨论】:

      【解决方案2】:

      其实 nashorn.jar 是一个扩展 jar。使用默认的安全策略,它会获得 AllPermission。如果您用自己的策略替换它,我认为您需要提供 AllPermission - nashorn.jar 需要能够创建新的类加载器、访问受限包等。

      【讨论】:

      • 我不希望 Nashorn 访问某些东西,例如反射,所以 AllPermission 不是一个选项。
      • Nashorn 需要 ClassLoader 创建权限。如果代码可以创建 ClassLoader 并加载类,它就可以有效地获得 AllPermission。如果你担心脚本会得到这些,你就不需要了。除非策略文件(通过脚本 URL)提供更多权限,否则编译的脚本类只会获得最小的沙盒权限
      • stackoverflow.com/questions/20793089/… 如果设置了 RuntimePermission("nashorn.JavaReflection") 就会有反射。我有一个运行正常的 nashorn,它的权限非常小。
      • 确实令人惊讶。使用最少的权限,nashorn 将无法加载您编译的 JS 脚本——因为这需要 ClassLoader 创建权限。您可能需要检查您的策略和 Java 命令行等。
      • 另外,我指的是 nashorn.jar 的 AllPermission,但这并不意味着 RuntimePermission("nashorn.JavaReflection") 仍然适用于编译的脚本类。即使 nashorn.jar 具有 AllPermission,编译后的脚本仍然不会具有反射权限。
      猜你喜欢
      • 2014-06-14
      • 2011-05-14
      • 1970-01-01
      • 2010-11-19
      • 2011-10-18
      • 2014-04-05
      • 1970-01-01
      • 1970-01-01
      • 2019-01-13
      相关资源
      最近更新 更多