プリペアドステートメントの使用

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 データベースにクエリを実行する

プリペアドステートメント

  • プレースホルダーを使用した事前コンパイル済み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...