IT박스

소나 위반 : 보안-어레이가 직접 저장 됨

itboxs 2020. 12. 5. 09:26
반응형

소나 위반 : 보안-어레이가 직접 저장 됨


소나 위반이 있습니다.

소나 위반 : 보안-어레이가 직접 저장 됨

public void setMyArray(String[] myArray) { 
  this.myArray = myArray; 
} 

해결책:

public void setMyArray(String[] newMyArray) { 
  if(newMyArray == null) { 
    this.myArray = new String[0]; 
  } else { 
   this.myArray = Arrays.copyOf(newMyArray, newMyArray.length); 
  } 
}

하지만 왜 그런지 궁금 해요?


저장하는 배열이 호출자가 보유한 배열과 동일하다는 불평이 있습니다. 즉, 호출자가 이후에이 배열을 수정하면 객체에 저장된 배열 (따라서 객체 자체)이 변경됩니다.

해결책은 전달 될 때 객체 내에서 사본을 만드는 것입니다. 이를 방어 적 복사 라고 합니다. 컬렉션의 후속 수정은 개체 내에 저장된 배열에 영향을주지 않습니다.

컬렉션을 반환 할 때 (예 : 해당 getMyArray()호출에서) 일반적으로이 작업을 수행하는 것도 좋은 방법 입니다. 그렇지 않으면 수신자가 수정을 수행하고 저장된 인스턴스에 영향을 미칠 수 있습니다.

이것은 배열뿐만 아니라 모든 변경 가능한 컬렉션 (실제로 모든 변경 가능한 객체)에 분명히 적용됩니다. 이것은 다른 문제와 함께 평가해야하는 성능 영향을 가지고 있습니다.


방어 적 복제라고합니다. 이 주제에 대한 좋은 기사는 "어쨌든 누구의 대상입니까?"입니다. by Brian Goetz, getter 및 setter에 대한 값과 참조 의미의 차이에 대해 설명합니다.

기본적으로 참조 의미론 (복사본 없음)의 위험은 배열을 소유하고 있다고 잘못 생각하고 수정하면 배열에 별칭이있는 다른 구조도 수정한다는 것입니다. 방어 복사 및 개체 앨리어싱과 관련된 문제에 대한 많은 정보를 온라인에서 찾을 수 있습니다.


나는 같은 문제가 있었다.

보안-어레이가 직접 저장 됨 사용자 제공 어레이 '팔로 미 타스'가 직접 저장됩니다.

내 원래 방법 :

public void setCheck(boolean[] palomitas) {
        this.check=palomitas;
    }

고정 설정 :

public void setCheck(boolean[] palomitas) { 
      if(palomitas == null) { 
        this.check = new boolean[0]; 
      } else { 
       this.check = Arrays.copyOf(palomitas, palomitas.length); 
      } 
}

다른 예 :

보안-어레이가 직접 저장 됨 사용자 제공 어레이

private String[] arrString;

    public ListaJorgeAdapter(String[] stringArg) {      
        arrString = stringArg;
    }

결정된:

public ListaJorgeAdapter(String[] stringArg) {  
    if(stringArg == null) { 
      this.arrString = new String[0]; 
    } else { 
      this.arrString = Arrays.copyOf(stringArg, stringArg.length); 
    } 
}

이를 제거하려면 다음 클래스 구현에 표시된대로 배열을 저장 / 반환하기 전에 Array를 복제해야합니다. 따라서 아무도 클래스의 원본 데이터를 수정하거나 가져올 수 없지만 복사본 만 가져올 수 있습니다.

public byte[] getarrString() {
    return arrString.clone();
}
/**
 * @param arrStringthe arrString to set
 */
public void arrString(byte[] arrString) {
    this.arrString= arrString.clone();
}

나는 이것을 이렇게 사용했고 이제는 SONAR 위반이 발생하지 않습니다 ...


이 모든 것보다 더 쉽습니다. Sonar 위반을 방지하려면 메소드 매개 변수의 이름을 다른 이름으로 변경하기 만하면됩니다.

http://osdir.com/ml/java-sonar-general/2012-01/msg00223.html

public void setInventoryClassId(String[] newInventoryClassId)
    {                
            if(newInventoryClassId == null)
            {
                    this.inventoryClassId = new String[0];
            }
            else
            {
                    this.inventoryClassId = Arrays.copyOf(newInventoryClassId, newInventoryClassId.length);
            }

    } 

방어 구현 방식을 사용하면 많은 시간을 절약 할 수 있습니다. Guava에서는 목표를 달성하기위한 또 다른 멋진 솔루션 인 ImmutableCollections를 얻을 수 있습니다.

http://code.google.com/p/guava-libraries/wiki/ImmutableCollectionsExplained


There are certain cases where it is a design decision and not missed out. In these cases, you need to modify the Sonar rules to exclude it so that it doesn't show such issues in report.

참고URL : https://stackoverflow.com/questions/11580948/sonar-violation-security-array-is-stored-directly

반응형