当前位置: 首页 > 面试题库 >

Java:为什么不应该将clone()用于防御性复制?

孙化
2023-03-14
问题内容

在有效的Java(第7章)中,它说

还要注意,我们没有使用Date的clone方法制作防御副本。由于Date是非最终的,因此不能保证clone方法返回一个类为java.util.Date的对象:它可能返回专门为恶意恶作剧而设计的不受信任子类的实例。这样的子类可以在创建实例时在私有静态列表中记录对每个实例的引用,并允许攻击者访问此列表。这将使攻击者可以在所有情况下自由支配。为防止此类攻击,请不要使用clone方法为类型可以由不受信任的子类继承的参数制作防御性副本。

我不太理解它的解释。为什么clone()不返回Date对象?实例如何是不受信任的子类?


问题答案:

考虑以下代码:

public class MaliciousDate extends Date { /** malicious code here **/ }

public class SomeClass {
    public static void main(String[] args) {
        MaliciousDate someDate = new MaliciousDate();
        Date copyOfMaliciousDate = someDate;
        Date anotherDate = copyOfMaliciousDate.clone();
    }
}

由于copyOfMaliciousDate类型为Date,因此您可以调用clone(),它将返回一个Date对象,但是cloneon
调用会copyOfMaliciousDate执行在MaliciousDate类中编写的代码,因为存储在中的
实例copyOfMaliciousDateMaliciousDate



 类似资料:
  • 从外观上看-似乎创建了一个对象的克隆。如果是这样,那么对于实现可克隆接口(只有不可变对象是新的,因为可变对象有引用复制)的关注,哪一个是最好的,为什么? 我昨天实现了克隆,然后意识到我必须为非字符串/首字母元素提供自己的修改。然后我被告知我现在正在使用的。这两个实现似乎都提供了类似的功能。 谢谢

  • 本文向大家介绍Java中为什么要用 clone?相关面试题,主要包含被问及Java中为什么要用 clone?时的应答技巧和注意事项,需要的朋友参考一下 在实际编程过程中,我们常常要遇到这种情况:有一个对象 A,在某一时刻 A 中已经包含了一些有效值,此时可能会需要一个和 A 完全相同新对象 B,并且此后对 B 任何改动都不会影响到 A 中的值,也就是说,A 与 B 是两个独立的对象,但 B 的初始

  • 问题内容: 我已经在Android SDK中看到了AccountManager,它用于存储帐户信息。因此,我找不到任何针对其用途的一般性讨论。有人知道AccountManager的目的是什么以及它能给您带来什么好处吗?对于适合哪种类型的帐户有任何意见?您将在这里将用户的帐户信息用于常规Web服务吗? 问题答案: 这个问题有点老了,但我认为它仍然值得关注。 ,然后一起去。 你不能有一个没有。 你不能

  • 问题内容: 通过它的外观- 似乎创建了一个对象的克隆。如果是这样的话,那么与实现Cloneable接口有关的担忧(只有不可变对象才是新对象,因为可变对象复制了引用)是最好的,为什么? 昨天我实现了cloneable,然后意识到我必须对非 String / Primative 元素提供自己的修改。然后,我被告知我正在使用哪个。两种实现似乎都提供了类似的功能。 谢谢 问题答案: Josh Bloch提

  • 问题内容: 触发服务器调用以获取componentWillMount生命周期方法中的数据是一种不好的做法? 以及为什么最好使用componentDidMount。 问题答案: 更新: componentWillMount将很快被弃用。 引用@Dan Abramov 在 React的未来版本中,我们期望componentWillMount 在某些情况下 会触发多次 ,因此您应该对网络请求使用comp

  • 问题内容: 看来,许多人已经开始用组合代替。这似乎很愚蠢,不幸的是,像Jenkins这样的工具无法为您做到这一点。那么,为什么git clone不采用refspec,就像git fetch一样? 具体来说,如果您希望在Jenkins上运行gerrit触发的构建任务,则需要确保工作空间存在,否则jenkins将无法检出包含gerrit更改的修订。这是因为gerrit使用的引用路径不在git克隆获取的