[시큐어코딩 가이드] 2-6-3. Public 메소드로부터 반환된 Private 배열

Public 메소드로부터 반환된 Private 배열

정의

파이썬은 명시적인 private선언이 없지만, 대부분의 파이썬 코드가 따르는 규칙으로 이름 앞에 밑줄(ex. _apple)로 시작하면 private로 처리됩니다. public으로 선언된 메소드에서 배열을 반환하면, 해당 배열의 참조 객체가 외부에 공개되어 외부에서 배열 수정과 객체 속성 변경이 가능해집니다. 이런 속성은 배열뿐만 아니라 변경가능한 모든 객체에 해당됩니다.

 

안전한 코딩기법

private로 선언된 배열을 public으로 선언된 메소드로 반환하지 않도록 해야합니다. private 배열에 대한 복사본을 반환하도록하고 배열의 원소에 대해서는 clone() 메소드를 통해 복사된 원소를 저장하도록 해서 private 선언된 배열과 객체 속성에 대한 의도치 않은 수정을 방지한다

 

코드예제

다음은 안전하지 않은 코드예제로, private변수를 생성하고 이를 반환하는 public 메소드를 사용하는 코드입니다.

#Public 메소드로부터 반환된 Private 배열(안전X)
class User:
    __private_variable = []
    def __init__(self):
        pass
    def get_private_member(self):
        return self.__private_variable

 

다음은 안전한 코드예제로, 내부와 외부의 배열이 서로 참조되는 것을 예방하기 위해 [:]로 새로운 객체를 생성하여 값을 반환하는 코드입니다.

#Public 메소드로부터 반환된 Private 배열(안전O)
class User:
    __private_variable = []
    def __init__(self):
        pass
    def get_private_member(self):
        return self.__private_variable[:]

 

 

 

캡슐화/Public 메소드로부터 반환된 Private 배열

[참고문헌] Python 시큐어코딩 가이드(2022) / KISA(한국인터넷진흥원)