[시큐어코딩 가이드] Private 배열에 Public 데이터 할당
- 정보보안/시큐어코딩 가이드
- 2022. 8. 9.
■ 캡슐화
중요한 데이터 또는 기능성을 불충분하게 캡슐화하거나 잘못 사용함으로써 발생하는 보안약점으로 정보노출, 권한 문제 등이 발생할 수 있다.
Private 배열에 Public 데이터 할당
■ 개요
public으로 선언된 메소드의 인자가 private 선언된 배열에 저장되면, private 배열을 외부에서 접근하여 배열 수정과 객체 속성 변경이 가능해진다.
■ 안전한 코딩 기법
public으로 선언된 메소드의 인자를 private선언된 배열로 저장되지 않도록 한다. 인자로 들어온 배열의 복사본을 생성하고 clone() 메소드를 통해 복사된 원소를 저장하도록 하여 private 배열에 할당하여 private 선언된 배열과 객체속성에 대한 의도하지 않게 수정되는 것을 방지한다.
만약 배열 객체의 원소가 String 타입 등과 같이 변경이 되지 않는 경우에는 인자로 들어온 배열의 복사본을 생성하여 할당한다.
코드예제
다음 예제는 __를 이용해서 Python의 내부 배열을 생성하고 외부 값을 대입하는 public 메소드를 사용하고 있다. 이 경우 특정 배열 타입에 따라 외부에서 private 배열을 변조할 수 있는 문제를 내포하고 있다.
안전하지 않은 코드의 예 |
import copy class UserObj(): __private_variable = [] def __init__(self): pass # private 배열에 외부 값을 바로 대입하는 public 메소드를 사용하는 # 경우 취약함 def set_private_member(self, num): self.__private_variable = num |
아래 예제는 내부와 외부의 배열이 서로 참조되는 것을 예방하기 위해 [:]로 새로운 객체를 생성하여 값을 대입하고 있다.
안전한 코드의 예 |
class UserObj(): def __init__(self): self.__privateVariable = [] # private 배열에 외부 값을 바로 대입하는 경우 [:]를 사용하여 # 외부와 내부의 배열이 서로 참조되지 않도록 해야 함 def set_private_member(self, num): self.__privateVariable = num[:] |