对私有 class 成员的引用怎么可能是危险的

How can references to private class members be dangerouse

我正在阅读 CERT Secure Coding Standard for Java

我正在为此苦苦挣扎rule。此规则的严重性很高,这意味着违反此规则可能会导致权限提升或代码执行。

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

您可能有一个在 class 的构造函数中建立的不变量,例如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 的创建日期的逻辑,则可以操纵它以这种方式表现不同。

在 Java 中,您通过非 private 函数来绕过 private 说明符,该函数 returns 对成员的引用。

这是因为可以修改成员通过该引用引用的对象。

你不妨老实说,用与函数相同的访问说明符标记 private 成员。

如果在 getter 上公开对私有可变对象(例如 Date 或任何可修改的 Collection)的引用,则可以从外部修改对象的状态。

假设您的 class:

中有 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实例的状态。所以使用你的人 class 可以修改其实例的内部状态。

另见 J。 Bloch 的 "Effective Java" 第 2 版,第 39 项 "Make defensive copies when needed",p. 184,你可以在那里找到关于这个tiopic的很好的解释。