我有哪些第三方“插件”可以由用户加载到提升用户体验的Java应用程序。 一个API存在通过这些插件使用,但第三方软件应该从访问内部应用类安全的目的受到限制。 受限制的包插件将是“com。示例”,并允许将“com.example.api”。 API类做作出的内部,混淆类调用。
研究此之后,我碰到的SecurityManager的一对夫妇的方法: checkMemberAccess(类,INT)和checkPackageAccess(字符串) ,这两者似乎是我的目标可行的路径。 然而,做一些测试,并进一步研究后,我发现,checkMemberAccess只适用于反射调用,当一个类加载器调用loadClass的checkPackageAccess只调用。
什么是限制访问包(com。示例,而不是com.example.api)以合理的方式?
我建议编写自定义类加载器插件,它可以隐藏的存在com.example
包使用的是类加载器加载的类。 通常的类装载器委托给他们的父母,但也有几种实现在野外,这将这样做只是部分或完全没有。 我相信如蚂蚁使用这种技术。 当这样的类加载器加载,对禁止functinality 链接的任何类将无法加载。 或者,如果实现使用迟缓链接,并成功地做了负载,也仍然被禁止代码执行过程中失败。
已经否认了禁包你的插件链接时进入,就可以使用了SecurityManager拒绝通过反射运行时访问,也拒绝一个新的类加载器可能被用来绕过你的创作。
class RestrictingClassLoader extends URLClassLoader {
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
if (!name.startsWith("com.example.") || name.startsWith("com.example.api."))
return super.loadClass(name);
return findClass(name);
}
}
class RestrictingSecurityManager extends SecurityManager {
private boolean isRestricted() {
for (Class<?> cls: getClassContext())
if (cls.getClassLoader() instanceof RestrictingClassLoader)
return true;
return false;
}
// Implement other checks based on isRestricted().
}