我目前正在阅读CERT Secure Coding Standard for Java。
我正在努力解决这个问题rule。此规则的严重性很高,这意味着违反此规则可能会导致权限升级或代码执行。
我真的不明白违反这条规则会导致如此致命的事情。有人可以举例说明违反此规则的代码遭到攻击吗?
答案 0 :(得分:2)
您可能拥有在类的构造函数中建立的不变量,例如date
包含实例的创建时间:
class Foo {
private final Date date;
Foo() { this.date = new Date(); }
Date getDate() { return date; }
}
现在,如果我致电getDate().setTime(0)
,我可以让实例看起来像是在1970-1-1 00:00:00Z
创建的。
如果你有一些基于Foo
的创建日期的逻辑,可以通过这种方式操纵它以表现不同。
答案 1 :(得分:2)
如果在getter上公开对私有可变对象(例如Date
或任何可修改的Collection
)的引用,则可以从外部修改对象的状态。
想象一下,你班上有List<String> getNames()
方法:
public class MyClass {
// fields and constructors are omitted
List<String> getNames() {
// return any mutable List implementation; for instance, ArrayList
}
}
您可以调用myClass.getNames().add("name")
,这将修改MyClass
实例的状态。因此,使用您的类的人可以修改其实例的内部状态。
另见 J. Bloch的“Effective Java”第2版,第39项“需要时制作防御性副本”,p。 184 ,你可以在那里找到非常好的解释。
答案 2 :(得分:1)
在Java中,您通过使用非private
函数来绕过private
说明符,该函数返回对该成员的引用。
那是因为可以修改成员通过该引用引用的对象。
您可以诚实地对待事物,并使用与该函数相同的访问说明符标记private
成员。