Подтвердить что ты не робот

Уязвимость вредоносного кода. Может отображать внутреннее представление путем включения ссылки на изменяемый объект.

У меня есть следующий код в моем классе dto.

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

И я получаю ошибку в сонаре, заявленном как таковой, и я не уверен, что я здесь делаю неправильно.

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

Класс - это dto, и метод автоматически создает метод setter. Что я делаю неправильно здесь. если бы кто-нибудь мог объяснить. это будет большой помощью.

4b9b3361

Ответ 1

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 billDate 

Чтобы этого избежать, вы можете захотеть Deep-copy перед установкой

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

Ответ 2

Интересно, почему ни одно из решений не принимает во внимание. Общее, нулевое безопасное решение должно выглядеть следующим образом:

public void setBillDate(Date billDate) {
    this.billDate = billDate != null ? new Date(billDate.getTime()) : null;
}

Ответ 3

Date изменен

и вы не создаете экземпляр Date, который пришел к вам, является параметром. Поэтому, если код клиента изменит значение объекта Date, это также повлияет на ваш класс.

Решение состоит в том, чтобы создать копию Date

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

Ответ 4

Рассмотрите также использование клона. Не забывайте проверить нуль.

public void setBillDate(Date billDate) {
    this.billDate = billDate == null ? null : billDate.clone();
}

Ответ 5

В дополнение к существующим ответам я предлагаю новую версию на основе класса Optional из Java 8.

public void setBillDate(Date billDate) {
    this.billDate = Optional
            .ofNullable(billDate)
            .map(Date::getTime)
            .map(Date::new)
            .orElse(null);
}

Ответ 6

Дата не является неизменной, т.е. ваш 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();
}

Ответ 7

Верхний номер ответа 37 - неправильный ответ: никто не заботится о NullPointerExceptions???

Вместо этого вы должны попробовать:

public void setBillDate(Date billDate) {
    this.billDate = billDate == null ? billDate : new Date(billDate.getTime());
}

Ответ 8

Может быть аргумент счетчика, почему один из них непреднамеренно меняет дату? Если клиент устанавливает значение, а затем изменяет его, тогда наш код должен отражать его, не так ли? Если нет, то это не смущает?

Я предпочитаю просто игнорировать это предупреждение FindBugs.

Если вы хотите сделать это, просто добавьте следующие зависимости Maven в свой pom.xml:

<!-- Findbugs -->
        <dependency>
            <groupId>com.google.code.findbugs</groupId>
            <artifactId>annotations</artifactId>
            <version>3.0.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.google.code.findbugs</groupId>
            <artifactId>annotations</artifactId>
            <version>3.0.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.google.code.findbugs</groupId>
            <artifactId>jsr305</artifactId>
            <version>3.0.1</version>
            <scope>provided</scope>
        </dependency>

а затем эти аннотации на уровне класса или члена поля в вашем POJO:

@SuppressFBWarnings(value = { "EI_EXPOSE_REP", "EI_EXPOSE_REP2" }, justification = "I prefer to suppress these FindBugs warnings")

Приветствия

Акшай