56

dto クラスに次のコードがあります。

public void setBillDate(Date billDate) {
    this.billDate = billDate;
}

そして、そのように述べられたソナーでエラーが発生し、ここで何が間違っているのかわかりません。

Malicious code vulnerability - May expose internal representation by incorporating reference to mutable object   

クラスは dto で、メソッドは自動的に作成されるセッター メソッドです。ここで何が間違っていますか。誰かが説明できれば。それは大きな助けになるでしょう。

4

8 に答える 8

114

Date可変です

そのセッターを使用すると、誰かが意図せずに日付インスタンスを外部から変更できます

このことを考慮

class MyClass {

   private Date billDate;


   public void setBillDate(Date billDate) {
      this.billDate = billDate;
   }

}

今、誰かがそれを設定することができます

MyClass m = new MyClass();

Date dateToBeSet = new Date();
m.setBillDate(dateToBeSet); //The actual dateToBeSet is set to m

dateToBeSet.setYear(...); 
//^^^^^^^^ Un-intentional modification to dateToBeSet, will also modify the m's billDate 

これを回避するには、設定する前にディープコピーすることをお勧めします

public void setBillDate(Date billDate) {
    this.billDate = new Date(billDate.getTime());
}
于 2013-09-23T08:36:26.410 に答える
49

どのソリューションも null を考慮していないのはなぜだろうか。一般的な null セーフ ソリューションは次のようになります。

public void setBillDate(Date billDate) {
    this.billDate = billDate != null ? new Date(billDate.getTime()) : null;
}
于 2014-01-14T12:49:53.657 に答える
3

Date可変です

そして、あなたが入ってきたのコピーを作成していないのは、パラメーターです。したがって、クライアント コードがオブジェクトの値を変更すると、クラスにも影響します。 DateDate

解決策は、のコピーを作成することですDate

public setBillDate(Date billDate){
   this.billDate = new Date(billDate.getTime());
}
于 2013-09-23T08:39:04.713 に答える
1

日付は不変ではありません。つまり、billDate は、DTO オブジェクトに設定された後に変更できます。または、コードで:

Date billDate = new Date();
dto.setBillDate(billDate);
billDate.setYear(1990);
// now, dto.getBillDate().getYear() == 1990

セッターをより安全にすることができます:

public void setBillDate(Date billDate) {
    this.billDate = (Date)billDate.clone();
}
于 2013-09-23T08:38:09.653 に答える