【问题标题】:Prohibit scripts from accessing specific Java classes using Java security Manager使用 Java 安全管理器禁止脚本访问特定的 Java 类
【发布时间】:2017-05-16 10:47:43
【问题描述】:

我已经在使用 Java 8,它是 Nashorn javascript 引擎。在我的应用程序中,我出于各种目的从 Java 类访问 JavaScript 脚本文件。然而,也可以从 javaScript 代码访问 Java 类。但由于我的应用程序中的 JavaScript 也可以由第三方编写,我想限制它们(JS 脚本)访问 Java 模块。 (特别禁止部分Java类)

我不想限制对Java类的所有访问,只是想寻找一种方法来限制或禁止某些特定的Java类。

Nashorn 中,我们可以通过使用 ClassFilters(覆盖 'exposeToScripts()' 方法)来做到这一点,如下所示。

class MyCF implements ClassFilter {
    @Override
    public boolean exposeToScripts(String s) {
      if (s.compareTo("myPackage.MyClass") == 0) return false;
      return true;
    }
}

但是我们如何使用 Java 安全管理器来做同样的事情,或者使用 ClassFilter(上面提到的)的方式足以捕获和限制所有不需要的 Java 类访问。

【问题讨论】:

    标签: javascript java nashorn securitymanager


    【解决方案1】:

    ClassFilter 不是安全管理器的替代品! ClassFilter JEP 页面 -> http://openjdk.java.net/jeps/202 在非目标部分明确说明了这一点:

    /[这不​​会] 使安全管理器对脚本来说是多余的。在评估来自不受信任来源的脚本之前,嵌入应用程序仍应打开安全管理。单独的类过滤不会提供完整的脚本“沙盒”。/

    ClassFilter 可以更好地控制安全管理器。例如,您可以通过阻止对 java.lang.Thread 类 [及其子类的名称] 的访问来避免从脚本创建线程。

    【讨论】:

    • 感谢您的澄清。那么关于如何使用安全管理器的任何想法?即限制访问脚本的特定 Java 类。
    • 查看本文档中的 package.access 属性 -> docs.oracle.com/javase/7/docs/technotes/guides/security/… 请注意,阻止对 java 包的访问适用于所有类。不仅适用于脚本生成的类!我提到了沙盒的安全管理器——不一定是为了防止脚本的 java 访问访问。我建议您在安全管理器上运行并设置 ClassFilter 以过滤来自 scripts 的特定类的访问。 package.access 安全性通常在 JRE 的标准安全性文件中设置。
    • 我想你指的是 java,jre 中 /security 文件夹中的 java.policy 文件。好吧,我使用提供的 securityManager 类配置了一个自定义安全管理器,是的,正如您所建议的,我们也可以在此之上拥有 Nashorn ClassFilter。这就是我目前正在做的事情,我只需要验证这些 Java 类是否仅限于任何第三方访问,而不仅仅是 JS 脚本。
    • 是的,你的方法对我来说听起来不错 [同时使用安全管理器和 Nashorn ClassFilter]
    猜你喜欢
    • 2010-10-20
    • 2017-03-06
    • 2011-09-13
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    相关资源
    最近更新 更多