Private 배열에 외부 배열 참조 직접 할당

Private 배열에 외부 배열 참조 직접 할당

설명

공개 메서드가 호출자가 전달한 리스트나 배열을 내부 private 필드에 그대로 저장하면 호출자가 메서드 호출 후 원본 객체를 수정해 내부 상태를 바꿀 수 있습니다.

잠재적 영향

  • 검증된 값 목록이나 권한 목록이 외부 참조를 통해 변경될 수 있습니다.
  • 내부 상태가 호출자와 공유되어 예측하기 어려운 보안 오류가 발생할 수 있습니다.

해결 방법

  • Python 리스트는 value[:], list(value), copy.copy(value) 등으로 복사해 저장하세요. 얕은 복사는 내부의 변경 가능한 요소를 공유하므로 필요한 경우 해당 요소도 복사하거나 불변 값으로 바꾸세요.
  • NumPy 배열의 기본 슬라이싱은 뷰를 만들므로 독립된 데이터가 필요하면 copy()를 사용하세요.
  • 저장 전 요소 타입과 허용 값을 검증합니다.

예시

아래는 요소 자체를 별도로 복사할 필요가 없는 Python 리스트를 가정합니다.

변경 전

python
def set_values(self, values):
    self.__values = values

변경 후

python
def set_values(self, values):
    self.__values = values[:]

설명:

  • 변경 전: 공개 메서드가 호출자가 전달한 리스트나 배열을 내부 private 필드에 그대로 저장하면 호출자가 메서드 호출 후 원본 객체를 수정해 내부 상태를 바꿀 수 있습니다.
  • 변경 후: 리스트를 얕게 복사해 외부 리스트의 추가·삭제·요소 교체가 내부 리스트에 직접 반영되지 않게 합니다.

참조