Java 声纳扫描-不应直接存储或返回可变成员

Java 声纳扫描-不应直接存储或返回可变成员,java,sonarqube,clone,mutable,Java,Sonarqube,Clone,Mutable,当我进行声纳扫描时,我发现了一个漏洞“不应直接存储或返回可变成员”。在提到应该克隆可变对象或返回不可修改列表时,也提供了解决方案。 但是,如果我克隆了该对象,并且以后如果我想更新该值,那么我如何才能访问原始对象,因为我已经返回了克隆的对象? 如果您对此有任何想法,我们将不胜感激。提前谢谢 但是,如果我克隆了对象,并且以后如果我想更新该值,那么我如何才能访问原始对象,因为我已经返回了克隆的对象 你没有。至少不是来电者 我会冒险说我们在讨论一份清单,所以: public class MyClass

当我进行声纳扫描时,我发现了一个漏洞“不应直接存储或返回可变成员”。在提到应该克隆可变对象或返回不可修改列表时,也提供了解决方案。 但是,如果我克隆了该对象,并且以后如果我想更新该值,那么我如何才能访问原始对象,因为我已经返回了克隆的对象? 如果您对此有任何想法,我们将不胜感激。提前谢谢

但是,如果我克隆了对象,并且以后如果我想更新该值,那么我如何才能访问原始对象,因为我已经返回了克隆的对象

你没有。至少不是来电者

我会冒险说我们在讨论一份清单,所以:

public class MyClass {
  private List<String> strings;

  public List<String> getStrings(){ 
    // returns a copy, so member list is still intact
    return new ArrayList<String>(strings);
  }

  public void addString(String newString) {
    strings.add(newString);
  }

  public void dropString(String oldString) {
    strings.remove(oldString);
  }

  public void replaceString(String oldString, String newString) {
    dropString(oldString);
    addString(newString);
  }
}
公共类MyClass{
私有列表字符串;
公共列表getStrings(){
//返回一个副本,因此成员列表仍然完整
返回新的ArrayList(字符串);
}
public void addString(String newString){
添加(新闻字符串);
}
公共void下拉字符串(字符串oldString){
字符串。删除(旧字符串);
}
public void replaceString(字符串oldString、字符串newString){
下拉字符串(oldString);
addString(新闻字符串);
}
}
换句话说,您可以通过所属类控制对成员操作的访问。如果你真的想要一个任何人都可以获取和更新的公共成员(我不建议这样做),那么放下getter,让该成员成为公共成员

但是,如果我克隆了对象,并且以后如果我想更新该值,那么我如何才能访问原始对象,因为我已经返回了克隆的对象

你没有。至少不是来电者

我会冒险说我们在讨论一份清单,所以:

public class MyClass {
  private List<String> strings;

  public List<String> getStrings(){ 
    // returns a copy, so member list is still intact
    return new ArrayList<String>(strings);
  }

  public void addString(String newString) {
    strings.add(newString);
  }

  public void dropString(String oldString) {
    strings.remove(oldString);
  }

  public void replaceString(String oldString, String newString) {
    dropString(oldString);
    addString(newString);
  }
}
公共类MyClass{
私有列表字符串;
公共列表getStrings(){
//返回一个副本,因此成员列表仍然完整
返回新的ArrayList(字符串);
}
public void addString(String newString){
添加(新闻字符串);
}
公共void下拉字符串(字符串oldString){
字符串。删除(旧字符串);
}
public void replaceString(字符串oldString、字符串newString){
下拉字符串(oldString);
addString(新闻字符串);
}
}

换句话说,您可以通过所属类控制对成员操作的访问。如果你真的想要一个任何人都可以获得和更新的公共成员(我不建议这样做),那么放下getter,让这个成员
公开

,在与st开发人员讨论之后,我又得到了一点。如果调用方来自我们的系统/应用程序,而不是来自外部,那么仍然传递可变对象将是一个漏洞?因为即使调用者更改可变对象,因为它来自系统内部,这也不会影响系统。@Swapneel我不是安全专家,但我认为假设调用者只会且始终是“内部的”被认为是有风险的。但是安全人员在本质上和本质上都是偏执狂。克隆应用程序中的每个集合对象是否会造成内存问题。getter方法可以从多个位置调用。因此,克隆发生了多次。在st开发人员讨论之后,我又得到了一点。如果调用方来自我们的系统/应用程序,而不是来自外部,那么仍然传递可变对象将是一个漏洞?因为即使调用者更改可变对象,因为它来自系统内部,这也不会影响系统。@Swapneel我不是安全专家,但我认为假设调用者只会且始终是“内部的”被认为是有风险的。但是安全人员在本质上和本质上都是偏执狂。克隆应用程序中的每个集合对象是否会造成内存问题。getter方法可以从多个位置调用。所以克隆会发生多次。