如何引用私人集体成员是危险的

时间:2016-07-14 13:47:12

标签: java security oop member

我目前正在阅读CERT Secure Coding Standard for Java

我正在努力解决这个问题rule。此规则的严重性很高,这意味着违反此规则可能会导致权限升级或代码执行。

我真的不明白违反这条规则会导致如此致命的事情。有人可以举例说明违反此规则的代码遭到攻击吗?

3 个答案:

答案 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成员。