由于我们可以使用反射来访问任何内容,无论它是一个字段,方法还是构造函数,声明私有内容真的有帮助/做什么?私人领域的唯一目的是告诉其他程序员嘿,这个领域不打算像这样使用吗?
在讨论安全问题时,有没有办法阻止用户访问API(为了主题的缘故,让它说是它的闭源)私有和受保护的字段?
答案 0 :(得分:2)
如果您允许不受信任的代码在没有安全管理器的JVM中运行,它可以通过setAccessible
关闭private
检查,从而通过反射提供private
字段和方法。
Java SecurityManager
有poor history of withstanding determined attacks因此,假设SecurityManager
会阻止可能导致任意字节码加载的确定攻击者是不合理的。
即使SecurityManager
成立,概念证明也显示了如何通过序列化API等低级Java API提取秘密。
Can a secret be hidden in a 'safe' java class offering access credentials?列出了尝试将敏感数据存储在同样运行不受信任代码的JVM中的字段中的一些缺陷。