[시큐어코딩 가이드] 잘못된 세션에 의한 데이터 정보 노출

 

 

 

■ 캡슐화

 

중요한 데이터 또는 기능성을 불충분하게 캡슐화하거나 잘못 사용함으로써 발생하는 보안약점으로 정보노출, 권한 문제 등이 발생할 수 있다.

 

 

잘못된 세션에 의한 데이터 정보 노출

 

■ 개요

 

다중 스레드 환경에서는 싱글톤(Singleton) 객체 필드에 경쟁조건(Race Condition)이 발생할 수 있다. 따라서, 다중 스레드 환경에서는 정보를 저장하는 전역 변수가 포함되지 않도록 하여, 서로 다른 세션에서 데이터를 공유하지 않도록 해야 한다.

 

 

■ 안전한 코딩 기법

 

싱글톤 패턴을 사용하는 경우, 변수 범위(Scope)에 주의를 기울여야 한다. 특히 다중 스레드 환경에서 클래스 변수의 값은 하위 메소드와 공유되므로 필요한 경우 인스턴스 변수로 선언하여 사용한다.

 

 

코드예제

 

다중 스레드 환경에서 파이썬의 클래스 변수는 스레드 간 서로 공유하게 된다.


클래스 변수에 값을 할당할 경우 서로 다른 세션 간에 데이터가 공유되어 의도하지 않은 데이터가 전달될 수 있다.

 

안전하지 않은 코드의 예
from django.shortcuts import render

class UserDescription:
user_name = ''

def get_user_profile(self):
result = self.get_user_discription(UserDescription.user_name)
......
return result

def show_user_profile(self, name):
# 클래스변수는 다른 세션과 공유되는 값이기 때문에 멀티스레드
# 환경에서 공유되지 말아야할 자원에 대해서 사용하는 경우
# 다른 세션에 의해 데이터가 노출될 수 있다.
UserDescription.user_name = name
self.user_profile = self.get_user_profile()

return render(request, 'profile.html', {'profile':self.user_profile})

 

공유되어서는 안 되는 변수는 인스턴스 변수로 선언하여 세션 간 공유 되지 않도록 한다.

 

안전한 코드의 예
from django.shortcuts import render

class UserDescription:

def get_user_profile(self):
result = self.get_user_discription(self.user_name)
......
return result

def show_user_profile(self, name):
# 인스턴스 변수로 사용하여 스레드 간 공유되지 못하도록 한다.
self.user_name = name
self.user_profile = self.get_user_profile()

return render(request, 'profile.html', {'profile':self.user_profile})

 

 

댓글

Designed by JB FACTORY