Używanie przygotowanych zapytań

Zapytania do bazy danych PostgreSQL w Javie

Miller Trujillo

Staff Software Engineer

Problem z instrukcjami Statement

String query = "SELECT * FROM books WHERE title = '" + title + "'";
stmt.executeQuery(query);
  • Wstrzyknięcie SQL następuje, gdy dane wejściowe są bezpośrednio osadzane w SQL
String title = "' OR 1 = 1 --";
  • Atakujący mogą zmienić logikę zapytania
String query = "SELECT * FROM books WHERE title = '' OR 1 = 1 --'";

$$

  • Wstrzyknięcie SQL może modyfikować nasze dane 🚫
Zapytania do bazy danych PostgreSQL w Javie

Wstrzyknięcie 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"
  • Wszystkie rekordy zostaną usunięte 🔄

$$

  • Ograniczanie uprawnień pomaga, ale nie wystarczy
  • Atakujący nadal mogą odpytywać wrażliwe dane
Zapytania do bazy danych PostgreSQL w Javie

Przygotowane zapytania

  • Prekompilowana instrukcja SQL używająca symboli zastępczych
String sql = "SELECT * FROM books WHERE title = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);

pstmt.setString(1, "Alice in Wonderland");
ResultSet rs = pstmt.executeQuery();
  • Parametry są escapowane i traktowane jako dane, nigdy jako kod SQL 🔒
Zapytania do bazy danych PostgreSQL w Javie

Praca z wieloma parametrami

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();
  • Każdy typ danych ma własną metodę ustawiającą
Zapytania do bazy danych PostgreSQL w Javie

Czas na ćwiczenia!

Zapytania do bazy danych PostgreSQL w Javie

Preparing Video For Download...