Använda Prepared Statements

Fråga en PostgreSQL-databas i Java

Miller Trujillo

Staff Software Engineer

Problemet med Statements

String query = "SELECT * FROM books WHERE title = '" + title + "'";
stmt.executeQuery(query);
  • SQL-injektion uppstår när användarindata bäddas in direkt i SQL
String title = "' OR 1 = 1 --";
  • Angripare kan ändra frågans logik
String query = "SELECT * FROM books WHERE title = '' OR 1 = 1 --'";

$$

  • SQL-injektion kan ändra vår data 🚫
Fråga en PostgreSQL-databas i Java

SQL-injektion

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"
  • Alla poster raderas 🔄

$$

  • Begränsade behörigheter hjälper, men räcker inte
  • Angripare kan ändå hämta känslig data
Fråga en PostgreSQL-databas i Java

Prepared Statements

  • Förkompilerat SQL-uttryck som använder platshållare
String sql = "SELECT * FROM books WHERE title = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);

pstmt.setString(1, "Alice in Wonderland");
ResultSet rs = pstmt.executeQuery();
  • Parametrar escapas och behandlas som data, aldrig som körbar SQL 🔒
Fråga en PostgreSQL-databas i Java

Arbeta med flera parametrar

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();
  • Varje datatyp har sin egen setter-metod
Fråga en PostgreSQL-databas i Java

Nu kör vi en övning!

Fråga en PostgreSQL-databas i Java

Preparing Video For Download...