【问题标题】:Injection Methods/Variables: public or Not?注入方法/变量:公开还是不公开?
【发布时间】:2010-11-08 23:45:03
【问题描述】:
许多 Java 框架允许将用于注入的类成员声明为非公共的。例如,Spring 和 EJB 3 中的注入变量可能是私有的。 JPA 允许对持久类的属性进行保护或包私有。
我们知道,如果可以,最好将方法声明为非公开的。话虽如此,如果我没记错的话,允许这些框架访问非公共成员仅适用于默认的 Java 安全管理器。不是说自定义代码也可以通过调用 setAccessible() 的反射获得对非公共成员的访问权限,会危及安全?
这引出了这个问题:为注入方法设置访问级别时,最佳做法是什么?
【问题讨论】:
标签:
java
security
spring
jpa
【解决方案1】:
通常,一个类需要选择加入持久性机制。例如,Java serialisatoin 需要一个类来实现java.io.Serializable。实现Serializable 的类有责任确保它们是安全的。如果库允许通过外部配置文件戳私有数据,那么这不应该被信任——反射真的很危险,而且它的使用通常会被搞砸。
当然,如果您确实发现了漏洞,请将其报告给相应的小组。
【解决方案2】:
如果您在与您的应用程序相同的 JVM 中运行不受信任的代码,并且您使用的是默认安全管理器设置,那么是的,这可能是一个安全漏洞。这是您需要注意的事情,但在实践中,这种情况非常罕见。