티스토리 뷰

반응형

 

 

 

가. 원인

  - Public으로 선언된 메서드의 인자를 Private 배열로 저장하는 경우

 

 

나. 영향

  - Private 배열을 외부에서 직접 접근하여 값을 수정이 가능

 

 

다. 보안대책

  - Public으로 선언된 메서드의 인자를 Private으로 선언된 배열에 저장하지 않도록 구현

  - 인자로 들어온 배열의 복사본을 생성하여 clone() 메서드를 통해 복사된 원소를 저장

  - 전달받은 Public 배열의 레퍼런스 대신 값을 Private 배열에 할당

 

 

라. 안전한 코드

1. clone으로 복사본을 생성

 

  public class UserManagement {

     private UserInfo[] myUsers;

     

     public void setUserInfo( UserInfo[] users) {

       this.myUsers = new UserInfo[ users.length ];

       // clone() 메서드를 사용하여 복사된 원소를 저장

       for( int i=0 ; i<users.lenght ; i++ ) 

          this.myUsers[i] = users[i].clone();

     }

  

 

2. Public 배열의 값을 복사

 

  public class MyClass {

     private String[] my_colors;

     

     public void setMyColor( String[] colors ) {

       this.my_colors = new String[ colors.length ];

       // 전달받은 Public 배열의 레퍼런스 대신 값을 복사

       for( int i=0 ; i<colors.lenght ; i++ ) 

          this.my_colors[i] = colors[i];

     }

  

 

 

마. 진단방법

<멤버변수 사용 확인>

  1. private 배열을 사용하는지 확인

  2. public 메서드의 인자를 private 배열에 직접할당하는지 확인

 

 

바. 정/오탐 케이스

<정탐 케이스>

  1. 새로운 배열을 생성 후 반복문으로 복사하지만, 배열의 원소가 일반객체일 경우
     ( private UserRole[] userRoles );

반응형
댓글
반응형
최근에 올라온 글
Total
Today
Yesterday