기술 노트/database
[Database] SQL Injection 방어 방법 - Prepared Statement
bigwhaleking
2024. 10. 5. 21:42
1. 개요
Prepared Statement는 SQL 구문이 미리 컴파일 되어 있어 입력값을 변수로 선언해 두고 필요에 따라 값을 대입하여 처리하는 방식입니다.
2. Statement & Prepared Statement
1) Statement
SELECT문은 DBMS 내부적으로 4단계의 과정(parse, bind, execute, fetch)을 거쳐서 출력하게 됩니다.
Statement는 4단계의 과정을 매번 수행합니다. 그렇기에 입력 값에 영향을 미치는 문자나 구문이 들어 갓을 경우 SQL Injection 공격으로 이어질 수 있습니다.
parse – 문법 검사, 의미 검사, 권한 검사, 실행 계획
bind – 입력 값 변수 선언
execute – 실행
fetch – 원하는 데이터 추출
2) Prepared Statement
Prepared Statement는 parse 과정을 최초 회만 수행한 후 결과를 메모리에 저장해 필요할 때 마다 사용합니다. Statement에 비해 시간을 단축 할 수 있습니다.
SQL구문이 미리 컴파일 되어 사용자 입력 값을 변수로 선언해 값을 대입하여 사용합니다. 그렇기에 외부 입력값으로 SQL문에 영향을 끼치지 못 합니다.
3) Statement 코드 & Prepared Statement 코드
-Statement code
String sql = "SELECT * FROM MEMBER WHERE ID = '"+id+"'AND PW = '"+pw"'";
-Prepared Statement code
PreparedStatement pstmt = null;
String sql = "SELECT * FROM MEMBER WHERE ID = ? AND PW = ?";
pstmt.setString(1, id);
pstmt.setString(2, pw);
3. Prepared Statement 유의점
반드시 반인딩 처리를 통해 외부 입력 값이 문법적 의미를 갖지 않도록 해야 합니다.