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