【问题标题】:Can i deny access to a jvm class by configuring java.policy file?我可以通过配置 java.policy 文件来拒绝对 jvm 类的访问吗?
【发布时间】:2010-11-02 18:21:33
【问题描述】:

我想在我的jdk6\jre\lib\security\java.policy 文件中添加一个禁令,以创建一些被 appengine 列入黑名单的类。例如,我希望本地 jvm 在应用程序尝试实例化 javax.naming.NamingException 时抛出异常。

有可能吗?

我将尝试在这里解释我的具体问题。 Google 提供的服务(GAE-google 应用引擎)对可以使用的类有一些限制。例如,不实例化 javax.naming 包中的 JNDI 类。他们还提供了一个测试服务器,可以用来在我的机器上测试这个应用程序,但是这个服务器允许这样的类并且可以执行代码。只有在将应用程序上传到 google 后,您才会发现自己使用了列入黑名单的课程。我在想是否不能在开发 jvm 上执行此类黑名单强制执行。否则我认为这很容易,他们可能已经提供了这样的策略文件。

【问题讨论】:

  • 首选白名单而不是黑名单。

标签: java security google-app-engine policy classloader


【解决方案1】:

Java 文档在此处列出了所有可能的策略权限: http://java.sun.com/javase/6/docs/technotes/guides/security/permissions.html

没有提到类创建/加载,所以我相信你不能使用策略来强制执行。

无论如何,为什么要在加载异常类时抛出异常?也许您可以解释您的问题,然后有人可以提出解决方案。

编辑:

防止加载某些类的一种方法是将它们从 JRE 安装中删除。大多数系统类都包含在 JDK/JRE 安装的 rt.jar 中。您应该可以使用任何 ZIP 工具对其进行修改。

只需创建一个特殊的 JRE 安装,然后修改它的 rt.jar。这是一个丑陋的黑客,但应该可以用于测试目的......

【讨论】:

    【解决方案2】:

    您可以编写一个小型加载器应用程序来创建new, custom classloader。然后可以使用这个类加载器加载您的应用程序类。

    在自定义类加载器中,当您的应用程序尝试访问您想要列入黑名单的类时,您可以抛出 ClassNotFoundException。

    您需要重载 load() 方法。此方法将负责在您的列入黑名单的类上抛出异常,或者如果允许该类,则委托给父类加载器。示例实现:

    public Class loadClass(String name) throws ClassNotFoundException {
        if(name.equals("javax.lang.ClassIDontLike")){
           throw new ClassNotFoundException("I'm sorry, Dave. I'm afraid I can't do that.");
        }
        return super.loadClass(name, false);
    }
    

    (当然,真正的实现可能比这更复杂)

    因为您的应用程序的类是通过此 Classloader 加载的,并且您只是在需要时将 loadClass() 调用委托给父类加载器,因此您可以将所需的任何类列入黑名单。

    我很确定这是 Google 用来将其服务器中的类列入黑名单的方法。他们在特定的类加载器中加载每个应用程序。这也类似于 Tomcat 隔离不同 Web 应用程序的方式。

    【讨论】:

    • 我认为 Class.forName() 可能会绕过自定义类加载器并直接进入引导/系统类加载。我认为甚至可以替换引导类加载器的命令行参数,可能也想看看那里
    • 你是对的,Class.forName() 将使用引导/系统类加载器。这是使用 Eclipse 时常见的问题来源。
    【解决方案3】:

    在测试程序时,您是否宁愿遇到编译错误而不是运行时错误?您可以配置您的 IDE 或编译器,以便在实例化不需要的类时向您发出警告。我知道 AspectJ 对此有一些不错的功能:您可以在连接点上定义编译警告/错误,并获得反馈,例如蚀。要在 Eclipse 中使用它,您只需安装 AspectJ 插件并编写一个合适的方面。要在从命令行或脚本编译时出现错误,您实际上必须使用 AspectJ 编译器,但我怀疑您是否需要它。

    【讨论】:

      猜你喜欢
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 2017-11-15
      • 2019-06-04
      • 1970-01-01
      • 2014-12-31
      • 2016-03-06
      • 1970-01-01
      相关资源
      最近更新 更多