Prepared Statement 사용

Java에서 PostgreSQL 데이터베이스 질의하기

Miller Trujillo

Staff Software Engineer

Statement의 문제점

String query = "SELECT * FROM books WHERE title = '" + title + "'";
stmt.executeQuery(query);
  • 사용자 입력을 SQL에 직접 넣으면 SQL 인젝션이 발생합니다
String title = "' OR 1 = 1 --";
  • 공격자는 쿼리 로직을 변경할 수 있습니다
String query = "SELECT * FROM books WHERE title = '' OR 1 = 1 --'";

$$

  • SQL 인젝션은 데이터를 변경할 수 있습니다 🚫
Java에서 PostgreSQL 데이터베이스 질의하기

SQL 인젝션

String query = "SELECT * FROM books WHERE title = '" + title + "'";
stmt.executeQuery(query);
title = "'; DELETE FROM books; --"
query = "SELECT * FROM books WHERE title = ''; DELETE FROM books; -- REST of query"
  • 모든 레코드가 삭제됩니다 🔄

$$

  • 권한 제한은 도움이 되지만 충분하지 않습니다
  • 공격자는 여전히 민감한 데이터를 조회할 수 있습니다
Java에서 PostgreSQL 데이터베이스 질의하기

Prepared Statement

  • 플레이스홀더를 사용하는 미리 컴파일된 SQL 문
String sql = "SELECT * FROM books WHERE title = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);

pstmt.setString(1, "Alice in Wonderland");
ResultSet rs = pstmt.executeQuery();
  • 매개변수는 이스케이프되어 데이터로만 취급되며, 실행 가능한 SQL이 아닙니다 🔒
Java에서 PostgreSQL 데이터베이스 질의하기

여러 매개변수 사용

String sql = "SELECT * FROM books WHERE title = ? AND publication_year = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);

pstmt.setString(1, "Alice in Wonderland"); pstmt.setInt(2, 1998);
ResultSet rs = pstmt.executeQuery();
  • 데이터 타입마다 전용 setter 메서드가 있습니다
Java에서 PostgreSQL 데이터베이스 질의하기

연습해 봅시다!

Java에서 PostgreSQL 데이터베이스 질의하기

Preparing Video For Download...