[시큐어코딩 가이드] 제거되지 않고 남은 디버그 코드
- 정보보안/시큐어코딩 가이드
- 2022. 8. 10.
■ 캡슐화
중요한 데이터 또는 기능성을 불충분하게 캡슐화하거나 잘못 사용함으로써 발생하는 보안약점으로 정보노출, 권한 문제 등이 발생할 수 있다.
제거되지 않고 남은 디버그 코드(시큐어코딩)
■ 개요
디버깅 목적으로 삽입된 코드는 개발이 완료되면 제거해야 한다. 디버그 코드는 설정 등의 민감한 정보를 담거나 시스템을 제어하게 허용하는 부분을 담고 있을 수 있다.
만일, 남겨진 채로 배포될 경우, 공격자가 식별 과정을 우회하거나 의도하지 않은 정보와 제어 정보가 노출될 수 있다.
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() |