[시큐어코딩 가이드] 제거되지 않고 남은 디버그 코드

 

 

 

■ 캡슐화

 

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

 

 

제거되지 않고 남은 디버그 코드(시큐어코딩)

 

■ 개요

 

디버깅 목적으로 삽입된 코드는 개발이 완료되면 제거해야 한다. 디버그 코드는 설정 등의 민감한 정보를 담거나 시스템을 제어하게 허용하는 부분을 담고 있을 수 있다. 

 

만일, 남겨진 채로 배포될 경우, 공격자가 식별 과정을 우회하거나 의도하지 않은 정보와 제어 정보가 노출될 수 있다.


Django 프레임워크, Flask 프레임워크는 전역적으로 DEBUG 모드를 설정할 수 있다. DEBUG 모드를 사용하면 브라우저에서 임의의 Python 코드를 실행할 수도 있고 Python에서 발생한 모든 오류가 출력되어 정보노출의 위험이 있다. 

 

어플리케이션을 배포 전에 반드시 DEBUG 모드를 비활성화 해야 한다.

 

 

■ 안전한 코딩 기법

 

소프트웨어 배포 전, 반드시 디버그 코드를 확인 및 삭제한다. Django 프레임워크의 경우 전역적으로 DEBUG 모드를 비 활성화 하려면 settings.py 파일에 설정을 하고 Flask 프레임워크는 app_run() 전에 debug = False로 설정한다.

 

 

코드예제

 

다음은 Django의 미들웨어 세팅 파일인 settings.py 파일이다. 개발 시 사용된 DEBUG 옵션이 True로 설정되어 있다.

 

■ Django 예제

 

안전하지 않은 코드의 예
from django.urls import reverse_lazy
from django.utils.text import format_lazy

DEBUG = True

ROOT_URLCONF = 'test.urls'
SITE_ID = 1

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': ':memory:',
}
}

 

개발이 끝난 소스코드를 운영, 배포 할 경우에는 DEBUG 옵션을 False로 변경해야 한다.

 

안전한 코드의 예
from django.urls import reverse_lazy
from django.utils.text import format_lazy

DEBUG = False

ROOT_URLCONF = 'test.urls'
SITE_ID = 1

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': ':memory:',
}
}

 

■ Flask 예제

 

다음은 Flask의 예제로 debug 모드가 True로 설정되어 있다.

 

안전하지 않은 코드의 예
from flask import Flask

app = Flask(__name__)
app.debug = True

@app.route('/')
def hello_world():
return 'Hello World!'

if __name__ == '__main__':
app.run()

 

개발이 끝난 소스코드를 운영, 배포 할 경우에는 debug 옵션을 False로 변경해야 한다.

 

안전한 코드의 예
from flask import Flask

app = Flask(__name__)
app.debug = False

@app.route('/')
def hello_world():
return 'Hello World!'

if __name__ == '__main__':
app.run()

 

 

댓글

Designed by JB FACTORY