对私有 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的很好的解释。
我正在阅读 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的很好的解释。