外部类访问包私有方法

13
假设我的包中有一个类org.jake,它有一个默认访问权限的方法(没有修饰符)。那么该方法仅在包内可见。
但是,当有人收到我的框架的jar文件时,有什么阻止他们编写一个新类,并将其包声明为org.jake,然后使用我本应不可见的方法呢?
换句话说,我能做些什么来防止这种情况发生吗?

也许值得编辑您的标题,以便不使用“protected”这个词,因为它具有非常特定的含义。 - Jon Skeet
4个回答

17
你可以在jar文件中封装包。但这并不是绝对安全的。
从安全角度来看,重要的是不要依赖访问修饰符等来开始编程。如果有人以无限制的权限运行代码,他们将可以访问各种各样的东西。访问修饰符确实有助于防止人们意外地自我伤害。
如果有人愿意将类放入你的包中以规避你的封装,他们显然正在忽略你的最好意图——让他们自己去做,但不要为这种情况提供支持。

6

无论如何,您都无法防止这种情况的发生。即使是私有成员也可以通过反射进行访问。在Java中,您应该将访问修饰符视为仅仅是建议性的。


1
首先,这是“DRM”场景:最终,足够决心的人可以通过提供奇怪的修改运行时或类似的东西来击败您设置的任何保护措施。Java 通过使用适当的 ClassLoader 限制来正确处理反向场景 - 其中运行时受信任,但某些软件包不受信任 - 但这只有在有办法以可信赖的方式强制执行限制的情况下才能起作用;这就是为什么您的方案基本上注定要失败的原因。
然而,如果我们假设运行时本身是可信的,那么您可以尝试在您的超级秘密方法中获取当前执行堆栈的堆栈跟踪(请参见stackoverflow.com/questions/1069066/…),并测试调用当前方法的调用者是否是您信任获得访问权限的人。安全管理器更合适,但您不能信任环境已经安装了您喜欢的那个(它更明显地受到攻击者的控制)。请注意,我没有尝试这段文字中的选项!
另一个选择是将您的密码放在您控制的服务上,并仅提供对远程访问的许可。或者,停止担心使用技术机制来解决基本上是涉及业务和法律问题的问题(例如,为什么您要处理您无法信任的人?)。

你不能使用 java.security.Permission 框架,因为用户可以授予自己完全的权限。 - Donal Fellows

0
我会建议您不要允许他们在同一个JVM中运行代码,即可以调用您的代码。相反,您可以考虑仅提供(Web)服务,以便他们可以从外部调用。但是,我对最佳实现方式并不是很了解。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接