티스토리 뷰

 

 

SQL Injection 이란?

악의적인 SQL문을 실행되게 함으로써 데이터베이스를 비정상적으로 조작하는 코드 인젝션 공격 방법이다.

2017년 3월에 일어난 "여기어때" 의 대규모 개인정보 유출 사건도 SQL Injectrion 으로 인해 피해가 발생하였다.

SQL Injectrion 공격은 공격은 쉬운데, 이로 인한 파급효과는 매우크다. 그렇다면 JPA는 SQL Injection 으로 부터 안전할까?


SQL Injection 방어하는법

PreparedStatement 사용

Prepared Statement를 사용하면 인자를 넣어주기 전의 쿼리를 DBMS가 미리 컴파일하여 대기하므로 이후, 인자에 대해서는 쿼리가 아닌 단순 문자열로 인식하기 때문에 안전하다.


 

JPA는 SQL Injection으로  부터 안전할까?

Spring Data JPA에서는 구현체로 Hibernate를 사용하고있다.

https://discourse.hibernate.org/t/is-criteriaapi-query-prone-to-sql-injection/6686/2

Hibernate는 항상 Prepared Statement를 사용하고있기때문에 SQL Injection으로 부터 안전하다고 볼수있습니다.

 

String query = "SELECT * FROM users WHERE userid ='"+ userid + "'" + " AND password='" + password + "'";
PreparedStatement stmt = connection.prepareStatement(query);
ResultSet rs = stmt.executeQuery();

하지만 Parameter Binding을 사용하지 않고 위와 같이 문자열 연결을 통한 동적 쿼리를 사용한다면 SQL Injection 공격에 취약할 수 있습니다.


 

https://giron.tistory.com/142

https://discourse.hibernate.org/t/is-criteriaapi-query-prone-to-sql-injection/6686/2

https://zudongza.tistory.com/entry/Hibernate%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-SQL-Injection-%EA%B3%B5%EA%B2%A9%EC%9D%98-%EB%B0%A9%EC%96%B4