访问包私有方法的外部类

时间:2010-05-21 06:25:28

标签: java access-modifiers package-private

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

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

换句话说,有什么办法可以防止这种情况发生吗?

4 个答案:

答案 0 :(得分:16)

您可以在jar文件中seal the package。但它并不是防弹。

主要的是不要依赖于访问修饰符等从安全的角度来开始,真的。如果某人运行具有不受限制权限的代码,他们将可以访问各种事物。访问修饰符实际上只是帮助阻止人们意外地在脚下射击。

如果有人愿意在你的软件包中放置类来规避你的封装,他们显然无视你的最佳意图 - 我说让他们继续使用它,但是不要为这种情况提供支持。

答案 1 :(得分:6)

你无法阻止这一点。甚至可以通过反思访问私人成员。您应该将java中的访问修饰符视为仅仅是提示性的。

答案 2 :(得分:1)

首先,这是“DRM”场景:最终,有人确定可以通过提供一个时髦的修改后的运行时或其他类似的东西来击败你实施的任何保护。反向场景 - 运行时受信任,但某些包不受欢迎 - 由Java通过使用合适的ClassLoader限制正确处理,但这只能在可以强制执行受信任限制的情况下工作。时尚;这就是你的场景基本上注定失败的原因。

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

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

答案 3 :(得分:0)

我只是说它们不允许它们运行可以调用你的代码,即在同一个JVM中。您可以考虑仅提供他们可以在外部调用的(Web)服务。我现在还不是最好的方法来实现这个目标。