- 버전
- 다운로드 14
- 파일 크기 5.91 MB
- 파일 수 1
- 생성 날짜 2022년 12월 29일
- 마지막 업데이트 2024년 2월 8일
[한국인터넷진흥원] Python 시큐어코딩 가이드(2022.12)
한국인터넷진흥원이 발간한
Python 시큐어코딩 가이드입니다.
업무에 참고 바랍니다.
○ 파일명 : Python시큐어코딩 가이드
○ 발간일 : 2022년 12월
○ 주관부처 : 한국인터넷진흥원
[개요]
인공지능, 블록체인 등 혁신적인 기술을 기반으로 하는 기업들이 기존 비즈니스 시장을 흔들고 새로운 트렌드를 만들어 가고 있다. 스마트폰은 전 국민의 일상이 되었으며 비대면 시장의 폭발적인 성장으로 묻는 정보의 흐름을 IT 기반 시스템으로 모이고 있다. 정보가 모이는 곳에는 항상 보안 위협이 뒤따르며, 다양한 IT 서비스를 개발하는 기업들 또한 이러한 위협에 노출될 수밖에 없다.
Ponemon Lnstitute의 보고서에 따르면, 60%의 침해사고가 패치되지 않은 알려진 취약점으로 인한 것이라고 밝혀졌다. 특히 사용자 정보를 처리하는 웹 애플리케이션 취약점으로 인해 중요정보가 유출되는 침해 사고가 발생한다. 또한 침해사고가 발생 전까지 취약점이 있다는 사실을 인지하지 못한 기업이 전체의 62%에 달하는 분석 결과도 있다.
보안사고의 위험성과 중요성을 인지한 많은 기업들이 침입차단 시스템, 안티 바이러스 제품들을 도입해 보안 수준을 강화하고 있다. 그러나 단순 제품 도입만으로 소프트웨어에 내재된 보안 취약점을 악용하는 공격에 대응하기 어렵다.
입력데이터 검증 및 표현
가. 개요
데이터베이스(DB)와 연동된 웹 응용프로그램에서 입력된 데이터에 대한 유효성 검증을 하지 않는다면 공격자가 입력 폼 및 URL 입력란에 SQL문을 삽입하여 DB로부터 정보를 열람하거나 조작할 수 있는 보안 약점을 말한다. 취약한 웹 응용프로그램에서는 사용자로부터 입력된 값을 검증 없이 넘겨받아 동적쿼리(Dynamic Query)를 생성하기 때문에 개발자가 의도하지 않은 쿼리가 실행되어 정보 유출에 악용될 수 있다.
파이썬에서는 데이터베이스의 접근에 사용되는 다양한 파이썬 모듈 간의 일관성을 장려하기 위해 DB-API를 정의하고 있고 각 데이터베이스마다 별도의 DB모듈을 이용해 데이터베이스에 접근한다. DB-API 외에도 파이썬에서는 Django, SQLAlchemy, Storm등의 ORM(Object Relational Mapping)을 사용하여 데이터베이스에 접근 할 수 있다.
파이썬에서 지원하는 다양한 ORM을 이용하여 보다 안전하게 DB를 사용할 수 있지만 일부 복잡한 조건의 쿼리문 생성 어려움, 성능저하 등의 이유로 직접 원시 SQL 실행이 필요할 때가 있다. ORM 대신 원시 쿼리를 사용하는 경우 검증되지 않은 외부 입력값으로 인해 SQL 삽입 공격이 발생할 수 있다.
나. 안전한 코딩기법
DB API 사용 시 인자화된 쿼리를 통해 외부 입력값을 바인딩해서 사용하면 SQL 삽입 공격으로부터 안전하게 보호할 수 있다. 파이썬에서 많이 사용되는 ORM 프레임워크로는 Django의 querySets, SQLAlchemy, Storm등이 있다. ORM 프레임 워크는 기본적으로 모든 쿼리문에 인자화된 쿼리문을 사용하므로 SQL 삽입 공격으로부터 안전하다.
ORM 프레임워크 내에서 원시 SQL을 사용할 때도 외부 입력값을 인자화된 쿼리문의 바인딩 변수로 사용하면 안전한 코드를 작성할 수 있다.
다. 코드 예제
가) DB API 사용 예제
다음은 MYSQL, PostgreSQL의 DB API를 사용해 입력값을 받아 처리하는 안전하지 않은 코드 예시다. 외부 입력값을 입력받아 변수 name과 content_id에 할당하고(line 8-9), 이 name과 content_id 값에 대한 별도의 검증 없이 쿼리문의 인자 값으로 사용하는 단순 문자열 결합을 통해 쿼리를 생성하고 있다.
이 경우 content_id 값으로 'a' or 'a' = 'a와 같은 공격 문자열을 입력한 조건절이 content_id = 'a' or 'a' = 'a'로 바뀌고, 그 결과 board 테이블 전체 레코드의 name 칼럼의 내용이 공격자가 전달한 name의 값으로 변경된다.
나) 안전한 코딩 기법
DB API 사용 시 인지화된 쿼리를 통해 외부 입력값을 바인딩해서 SQL 삽입 공격으로부터 안전하게 보호할 수 있다.
파이썬에서 많이 사용되는 ORM 프레임워크로는 Djanggo의 querySets, SQLAlchemy, Storm등이 있다. ORM 프레임워크는 기본적으로 모든 쿼리문에 인지화된 쿼리문을 사용한다. SQL 삽입 공격으로부터 안전하다.
ORM 프레임워크 내에서 원시 SQL을 사용할 경우에도 외부 입력값을 인지화된 쿼리문의 바인딩 변수로 사용하면 안전한 코드를 작성할 수 있다.
다) 코드 예제
- DB API 사용예제
다음은 MySQL, PostgreSQL의 DB API를 사용해 입력값을 받아 처리하는 안전하지 않은 코드 예시다. 외부 입력값을 입력 받아 변수 name과 content_id에 할당하고(line 8-9), 이 name과 content_id 값에 별도의 검증 없이 쿼리문의 인자 값으로 사용하는 단순 문자열 결합을 통해 쿼리를 생성한다. (line 12-15)
이 경우 content_id 값으로 'a' or 'a' = 'a와 같은 공격 문자열을 입력하면 조건절이 content_id = 'a' or 'a' = 'a'로 바뀌고, 그 결과 board 테이블 전체 레코드의 name 칼럼의 내용이 공격자가 전달한 name의 값으로 변경된다.
더 자세한 내용은 한국인터넷진흥원에서 발간한 가이드북을 참고하시길 바랍니다.