1

我们正在构建一个引擎,允许我们随时添加新的 jar 文件,加载这些 jar 文件并查找某些特定功能,并运行公开该功能的代码。目前的计划是使用 ServiceLoader 来执行此操作(只是一个额外的细节;我不同意这个想法)。目前让我们假设我们完全控制要加载哪些 jar 文件(很大的假设——我想我最终也会发布一些关于它的内容)。

鉴于这一切,我想限制对某些类的这些扩展的访问。对于一个假的例子,我们要确保java.io.PrintStream他们使用 而不是使用our.better.PrintStreamSolution

我真的不知道我能在这里做什么。由于目前我们拥有将作为扩展发布的代码,我们可以进行非常彻底的代码审查,但我宁愿在安装时进行静态分析,或者在运行时实际抛出错误。知道如何实现这一目标吗?

4

2 回答 2

2

您需要将 API 列入白名单。反射 API 无处不在,因此您无法将其列入黑名单。为此,您需要使用 ASM 之类的库来检查 jar。虽然您可以使用URLClassLoader自定义 URL 连接处理程序,但我建议使用自定义类加载器。我强烈建议避免与全局状态有关的任何事情,例如ServiceLoader.

于 2012-06-19T00:45:50.037 回答
1

创建一个特殊的 ClassLoader 来读取 JAR,并覆盖方法“loadClass”,这样如果类加载器试图从“java.io”包中加载一个类,它就会抛出 SecurityException。像这样的东西:

protected Class loadClass(String name, boolean resolve)
                                            throws ClassNotFoundException { 
       if (name.startsWith("java.io")) 
             throw new SecurityException("java.io access not allowed on extensions");

        return super.loadClass(name,resolve); 
} 

请记住在 ClassLoader 的重写 findClass 方法中实现您的类加载逻辑。

如果扩展可以获取另一个类加载器(如系统类加载器)来加载“禁止”类,则此检查可能会失败。

如评论中所示,仅当安全管理器可以识别正在从扩展中访问包时,才可以使用 SecurityManager 的替代方法。

于 2012-06-19T00:50:30.607 回答