外部类访问包私有方法

Posted

技术标签:

【中文标题】外部类访问包私有方法【英文标题】:Outside classes accessing package-private methods 【发布时间】:2011-02-22 05:24:35 【问题描述】:

假设我的包org.jake 中有一个类,它有一个默认访问(无修饰符)的方法。然后该方法仅在包内可见。

但是,当有人收到我的框架的 jar 时,是什么阻止他们编写新类,将其包声明为 org.jake,并使用我所谓的不可见方法?

换句话说,我能做些什么来防止这种情况发生吗?

【问题讨论】:

可能值得编辑您的标题,使其不使用“受保护”一词,因为它具有非常特定的含义。 【参考方案1】:

首先,这是“DRM”场景:最终,有足够的人可以通过提供一个时髦的修改运行时或其他类似的东西来击败你设置的任何保护。相反的场景——运行时是可信的,但一些包不可信——Java 通过使用合适的ClassLoader 限制来正确处理,但这只能在可以以可信方式强制执行限制的情况下起作用;这就是为什么你的场景基本上注定要失败的原因。

但是,如果我们假设运行时本身是可信的,那么您可以尝试在您的超级机密方法中获取当前正在执行的堆栈的堆栈跟踪(参见***.com/questions/1069066/… 了解如何)并测试以查看当前方法的调用者是否是您信任可以访问的调用者。安全管理器会更合适,但您不能相信环境会安装您喜欢的其中一个(它更明显地处于攻击者的控制之下)。请注意,我没有尝试过本段中的选项!

另一种选择是将您的秘密放在您控制的服务上,并且只提供对它们的远程访问。或者不要再担心使用技术机制来处理从根本上与商业和法律问题有关的问题(例如,你为什么要与你不信任的人打交道?)

【讨论】:

您不能使用java.security.Permission 框架,因为用户可以授予自己全部权限。【参考方案2】:

我只想说不允许他们在可以调用您的代码的地方运行代码,即在同一个 JVM 中。相反,您可以考虑只提供他们可以从外部调用的(网络)服务。不过,我不是很了解实现这一点的最佳方法。

【讨论】:

【参考方案3】:

你可以在你的 jar 文件中seal the package。虽然它不是防弹的。

从安全的角度来看,最重要的是不要依赖访问修饰符等,真的。如果有人以不受限制的权限运行代码,他们将有权访问各种事物。访问修饰符实际上只是帮助阻止人们不小心在脚上开枪。

如果有人愿意在你的包中放入类来规避你的封装,他们显然无视你的最佳意图——我说让他们继续做下去,但不要为这种情况提供支持。

【讨论】:

【参考方案4】:

您无法采取任何措施来防止这种情况发生。甚至私有成员也可以通过反射访问。您应该认为 java 中的访问修饰符仅仅是暗示性的。

【讨论】:

以上是关于外部类访问包私有方法的主要内容,如果未能解决你的问题,请参考以下文章

内部类

内部类

java内部类可以访问外部类的静态方法吗

Java内部类

从 PHP 中的类外部调用私有方法和私有属性

Java常用类