정의
조작된 쿼리문이 DB에 그대로 전달 되서 비정상적인 명령을 실행시키는 방법
공격 예시
로그인 기능을 제공한다고 가정하자.
Statement를 사용하면 아래와 같은 문법으로 작성하게 된다.
String sql = "SELECT * FROM user WHERE id ="+id+" AND password="+password;
사용자가 id에 1을 입력했다면 sql은 "SELECT * FROM user WHERE id=1 AND password="+password 가 된다.
사용자가 id에 1이 아닌 "1 OR 1=1 --"을 입력했다고 가정하자. password에는 1을 입력했다고 가정하자.
그러면 SQL문은 다음과 같이 된다.
SELECT * FROM user WHERE id=1 OR 1=1 -- AND password=1;
여기서 --은 주석이기 때문에 password 검증은 사라지고 모든 유저 정보가 전부 나온다.
방어 방법
prepared statement는 입력값을 하나의 필드값으로 넣어서 sql을 만드는 방법이다.
SELECT * FROM user WHERE id = ? AND password = ?;
즉, 사용자가 id에 "1 OR 1=1 --"을 삽입해도 지금까지 id 뒤에 오는 값은 하나의 필드값으로 분석했으므로 "1 OR 1=1 --"이 id를 비교하는 하나의 필드값으로 인식을 해버린다.
결과적으로 구문이 바뀌지 않고, id가 "1 OR 1=1 --"인 것이 없으므로 결과가 조회되지 않는다.
Reference
https://jaehoney.tistory.com/179
Java - PreparedStatement란 무엇인가?
Statement 자바에서 쿼리문을 사용할 때 java.sql 패키지에 있는 Statement를 사용한다. Statement는 SQL문을 실행할 때 사용하는 인터페이스이다. Statement는 다음과 같은 동작 방식을 가진다. PreparedStatement P
jaehoney.tistory.com
'Computer Science > Database' 카테고리의 다른 글
DB Lock (0) | 2024.04.23 |
---|---|
CAP 이론 (0) | 2024.04.23 |
클러스트링과 Replication (0) | 2024.04.23 |
파티셔닝과 샤딩 (0) | 2024.04.23 |
DB Index (0) | 2024.04.23 |