QueryDSL과 SQL Injection
Q. SQL Injection 공격의 대표적인 패턴에는 어떤 것들이 있나요?
SQL Injection의 대표적인 공격 패턴들이 있습니다. 첫번째로 항상 참이 되는 조건을 주입하는 Tautology Attack이 있습니다. 예를 들어 '1'='1' 과 같은 조건문을 입주입한다면 항상 참이므로 모든 사용자 정보가 노출 될 수 있씁니다. 두번째로 Union 기반 공격과 중첩 쿼리가 있습니다. 새로운 SQL문을 작성해서 Union으로 연결하거나 AND로 묶어서 조회한다면 다른 테이블의 정보를 조회할 수 있습니다.
Q. QueryDSL을 사용하면 SQL Injection 공격에 대해 안전할까요? 그렇다면 그 이유는 무엇인가요?
스프링의 QueryDSL을 쓴다면 대체적으로 SQL Injection 공격으로부터 안전합니다. 여러 이유 중 가장 큰 이유로 Prepared Statement가 있습니다. QueryDSL은 파라미터 바인딩을 자동으로 처리합니다. 사용자가 입력한 값을 직접 쿼리문에 결합하는 것이 아니라, 준비된 statement를 사용해서 파라미터를 안전하게 연결합니다. 또한 QueryDSL은 타입 세이프한 방식으로 쿼리를 작성하기 때문에 컴파일 시점에 타입이 체크되므로, 악의적인 문자열이 쿼리에 직접 삽입도리 가능성을 차단하고, 내부적으로 escape 처리를 자동으로 수행해서 특수문자나 위험할 수 있는 문자들을 자동으로 이스케이프 처리해서 안전하게 처리합니다.
Q. Prepared Statement가 뭔가요?
Prepared Statement는 SQL 쿼리의 템플릿을 미리 만들어두고, 실행 시점에 파라미터 값만 바인딩하는 방식입니다. 예를들어 "SELECT * FROM users WHERE name = ' + name + "'"; 가 있다고 가정했을 때, name에 악의적인 값이나 코드가 들어올 경우 SQL Injection 공격이 가능해집니다. Prepared Statement는 이런 공격에 방어하기위해 파라미터가 문자열로 처리되어 쿼리문의 구조를 변경할 수 없습니다. 또한, 부가적인 장점으로 쿼리문과 파라미터가 분리되어 있어 코드의 이해도가 증가합니다. 이러한 이유로 Preapred Statement는 ORM같은 현대 데이터베이스 프로그래밍에서 널리 사용되는 표준적인 방식입니다.
Last updated