SQL Injection 이란 해커에 의해 조작된 쿼리문이 데이터베이스에 전달되어 비정상적인 명령을 실행시키는 공격 방법입니다.
여기서 조작된 쿼리문이란 유저가 입력하는 파라미터에 정상적인 값이 아니라 'or 1=1 , where 1=1 과 같이 무조건 실행 될 수 있도록 조건과 해커가 원하는 쿼리문을 같이 입력한 쿼리문을 의미합니다.
예시1)
SELECT * FROM user WHERE id='abc' AND password = '1234';
id에 SQL INJECTION
abc -> ' or 1=1 --
결과 : SELECT * FROM user WHERE id='' OR 1=1 -- AND password = '1234'
-> select * from user 가 됨
예시2)
INSERT INTO Students (이름) VALUES ('학생 이름');
학생 이름 -> 'Robert'); DROP TABLE Students;--
INSERT INTO Students (이름) VALUES ('Robert'); DROP TABLE Students; --');
결국 Students 테이블에 모든 데이터 다 날아감
대응방안
1. 입력 값에 대한 검증
-> 입력 값에 대해서 특수문자 필터링 및 검증 필요
화이트리스트 : 제일 안전하지만 사용자 입력 값이 제한되는 부분 존재.
id, password 같은 부분은 화이트리스트로 관리하는 것이 어렵다.
블랙리스트 : ' , -- , = ,DROP ,WHERE 와 같이 특수문자나 DB에 영향 갈 수 있는 부분에 대해서 블랙리스트로 관리할 수 있음. 다만 이 경우 하나라도 뚫리면 취약해지기 때문에 관리가 힘들다. 소극적인 방법이라고 볼 수 있음.
2. Prepared Statement 구문사용
Statement란 실제 DB에 쿼리가 전달되어 분석,수행,결과까지 이루어지는 것을 의미합니다.
Statement라고 SQL문을 실행할 때 사용하는 인터페이스가 존재
Statement는 4가지 동작방식
1.parse
2.bind
3.execute
4.patch
Prepared Statement는 1번 parse 과정을 캐싱을 해서 2,3,4만 실행할 수 있게 하는 것.
SQL Injection 관점에서 Prepared Statement를 사용한다는 것은 아래와 같은 의미.
Satement 사용시 아래와 쿼리 같음
String sql = "SELECT * FROM user WHERE id ="+id+" AND password="+password;
Prepared Statement 사용시 아래와 쿼리 같음
SELECT * FROM user WHERE id = ? AND password = ?;
Prepared Statment 사용시 ?에 해당하는 파라미터값 이스케이핑 처리하여 문자열로 바꾸어
대입. 이스케이핑 처리하는 과정을 통해 SQL Inejection을 막을 수가 있다.
3. 에러 메시지 노출 금지
-> 데이버 베이스 관련 에러 발생시 해당 메시지를 사용자에게 노출 금지X
노출 하는 경우에 해커가 데이터베이스의 구조에 대해서 파악이 가능해지기 때문.
-> 에러 발생시 별도 에러 페이지 구성 필요
'CS > Database' 카테고리의 다른 글
[DB] JDBC란? (0) | 2024.01.08 |
---|---|
[DB] Statement 란? Prepared Statement 란? (0) | 2024.01.05 |