- SQL 인젝션(SQL 삽입) 취약점 대응방안 : Prepared Statement와 바인딩변수 이용
- Prepared Statement를 쓰면 SQL 인젝션 공격이 불가능할 수 밖에 없는 내부 작동 원리를 설명하고자 함
##SELECT 문 실행 과정
우리가 웹 상에서 입력한 쿼리는 DBMS 내부적으로 4가지 과정(parse, bind, execute, fetch)을 거쳐 결과를 출력
1.SELECT 문 실행과정
select * from user → parse(구문분석) → bind(치환) → execute(실행) → fatch(인출)
출처 : https://m.blog.naver.com/blogpyh/220675109307
##Statement와 Prepared Statement의 차이 (파싱과 바인딩)
Statement
- Statement를 사용하여 SELECT 쿼리를 입력했을 때에는 매번 parse부터 fetch 까지 모든 과정을 수행합니다.
Prepared Statement
- parse 과정을 최초 1번만 수행하고 이후에는 생략가능
- parse 과정을 모두 거친 후에 생성된 결과는 메모리 어딘가에 저장 해두고 필요할 때마다 사용
- 반복적으로 트리를 사용하기 위해서 자주 변경되는 부분을 변수로 선언해두고, 매번 다른 값을 대입(바인딩)하여 사용합니다.
!바인딩 데이터는 SQL 문법이 아닌 내부의 인터프리터나 컴파일 언어로 처리하기 때문에 문법적인 의미를 가질 수 없다
따라서 바인딩 변수에 SQL공격 쿼리를 입력할지라도 의미있는 쿼리로 동작하지 않는다.
##결론
- Prepared Statement에서 바인딩 변수를 사용하였을 때, 쿼리의 문법 처리과정이 미리 선 수행
- 바인딩 데이터는 SQL 문법적인 의미를 가질 수 없다.
따라서 Prepared Statement를 사용하면 SQL 인젝션 공격에 안전하게 구현 할 수 있다.
2.SELECT 파싱 트리
- parse(구문분석)
- 문법 검사
- 의미 검사
- 권한 검사
- 실행 계획
- bind(치환)
- execute(실행)
- fatch(인출)