방어적 복사/불변 객체

지노·2021년 3월 9일
0

학습 로그

목록 보기
3/3
post-custom-banner

TOC/TOU Attack

유효성 검사 시점/객체 사용 시점에 원본 객체를 수정하여 공격

방어 방안

방어적 복사

// 생성자로 받은 객체 방어적 복사
public Period(Date start, Date end) {
    this.start = new Date(start.getTime()); // defensive copy
    this.end = new Date(end.getTime());     // defensive copy
    if (this.start.compareTo(this.end) > 0) {
        throw new IllegalArgumentException("start가 end보다 늦으면 안된다");
    }
}
// getter 방어적 복사
public Date getStart() {
    return new Date(start.getTime());
}

public Date getEnd() {
    return new Date(end.getTime());
}

불변 객체

private static final Integer[] PRIVATE_VALUES = new Integer[]{ 1,2,3 };
public static final List<Integer> VALUES =
    Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES));

clone() 메소드

만약 생성자를 통해서 전달된 데이터가 변경가능한 객체일 때 이를 복사하기 위해서 clone() 메소드를 호출하고 싶을 때는 해당 클래스가 final로서 추가적으로 상속가능한 클래스가 아니어야 한다.
그 이유는 추가적으로 상속할 수 있는 경우 해당 객체의 clone()메소드를 실행 했을 때, 해당 객체가 반환된다고 보장할 수 없기 때문이다.

출처: https://wedul.site/294 [wedul]

프로젝트 적용

# [객체지향] 방어적 복사 - 2
## 내용
- 원본 객체 수정을 방지하기 위해 List 반환 시에 새로운 리스트를 생성하여 반환
## 링크
- https://velog.io/@jh8579/%EB%B0%A9%EC%96%B4%EC%A0%81-%EB%B3%B5%EC%82%AC%EB%B6%88%EB%B3%80-%EA%B0%9D%EC%B2%B4
public List<Card> shuffleCards() {
        List<Card> cards = new ArrayList<>(deck);
        Collections.shuffle(cards);
        return new ArrayList<>(cards);
}
profile
Spring Framework를 이용한 웹 개발과 AWS 서비스, Container를 사용한 CI/CD 인프라에 관심이 있습니다.
post-custom-banner

0개의 댓글