DBMS 조회 시 질의문(SQL) 내 입력값과 그 조회결과에 대한 유효성 검증방법(필터링 등) 설계 및 유효하지 않은 값에 대한 처리방법을 설계해야 한다.
(입력데이터 검증 및 표현) SQL 삽입
① 애플리케이션에서 DB연결을 수행할 때 최소권한의 계정을 사용
② 외부 입력값이 삽입되는 SQL질의문을 동적으로 생성, 실행 제한
③ 외부 입력값을 이용해 동적으로 SQL질의문을 생성해야 하는 경우, 입력값에 대한 검증을 수행한 뒤 사용
① 애플리케이션에서 DB연결을 위해 사용되는 계정은 해당 애플리케이션이 사용하는 데이터에 대한 읽기, 쓰기, 삭제, 업데이트 권한만 설정
② SQL 질의문의 구조가 외부 입력값에 의해 변경되지 않는 API를 사용하도록 시큐어코딩 규칙을 지정
→ORM프레임워크를 사용하여 안전한 정적 쿼리 구조로 SQL문을 수행할 수 있도록 개발환경을 설정
→ORM프레임워크에서 제공하는 함수를 활용하여 외부 입력값에 의해 SQL 질의문의 구조가 변경되지 않도록 제한
③ 클라이언트와 서버 양측에서 입력값에 대해 안전한 값만 사용될 수 있도록 검증작업을 수행
(ㄱ) 필터를 이용한 입력 값 검증
외부입력값에서 SQL삽입이 가능한 문자열들을 필터링하여 안전한 값으로 치환하도록 하는 Filter 컴포넌트를 생성
DB에서 관리하는 데이터를 처리하는 모든 애플리케이션에 일괄적용
Interceptor 컴포넌트를 사용하여 입력값에 대한 검증
작업을 수행한 뒤 요청을 차단하거나 허용하는 정책을 애플리케이션에 일괄 적용한다.
(ㄴ) 인터셉트를 이용한 입력 값 검증
MVC프레임워크를 사용하는 경우 Interceptor 컴포넌트를 사용하여 입력값에 대한 검증 작업을 수행
요청을 차단하거나 허용하는 정책을 애플리케이션에 일괄 적용
(ㄷ) 라이브러리 또는 Validator 컴포넌트를 이용한 입력값 검증
입력값을 검증하는 Validator 컴포넌트를 공통코드로 생성하고, 모든 개발자가 SQL질의문에 삽입되는 입력값에 대해 검증작업을 해당 컴포넌트에서 수행하도록 시큐어코딩 규칙을 정의한다.
SQL삽입 취약점을 최소화하고 SQL문을 안전하게 처리할 수 있도록 아래 라이브러리 활용
Java
Hibernate
MyBatis
JPA(Java Persistence API)
ASP.NET
AntiSQLi 라이브러리
PHP
MeekroDB 라이브러리
HTML Purifier 라이브러리