[DB] Statement Prepare Statement의 바인딩보안

been·2021년 2월 5일
0

TIL2

목록 보기
13/14
  • 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(구문분석)
    1. 문법 검사
    2. 의미 검사
    3. 권한 검사
    4. 실행 계획
  • bind(치환)
    • 값을 입력 받아 변수 선언 하는 것
  • execute(실행)
    • 디스크에서 블록을 찾아서 버퍼에 복사
  • fatch(인출)
    • 블록에서 원하는 데이터를 추출하는 과정

0개의 댓글