Prepared Statements gebruiken

Query's uitvoeren op een PostgreSQL-database in Java

Miller Trujillo

Staff Software Engineer

Het probleem met Statements

String query = "SELECT * FROM books WHERE title = '" + title + "'";
stmt.executeQuery(query);
  • SQL-injectie gebeurt als gebruikersinvoer direct in SQL wordt opgenomen
String title = "' OR 1 = 1 --";
  • Aanvallers kunnen de logica van de query veranderen
String query = "SELECT * FROM books WHERE title = '' OR 1 = 1 --'";

$$

  • SQL-injectie kan onze data aanpassen 🚫
Query's uitvoeren op een PostgreSQL-database in Java

SQL-injectie

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 van de query"
  • Alle records worden verwijderd 🔄

$$

  • Beperkingen helpen, maar zijn niet genoeg
  • Aanvallers kunnen nog steeds gevoelige data opvragen
Query's uitvoeren op een PostgreSQL-database in Java

Prepared Statements

  • Vooraf gecompileerde SQL-statement met placeholders
String sql = "SELECT * FROM books WHERE title = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);

pstmt.setString(1, "Alice in Wonderland");
ResultSet rs = pstmt.executeQuery();
  • Parameters worden ontsnapt en als data behandeld, nooit als uitvoerbare SQL 🔒
Query's uitvoeren op een PostgreSQL-database in Java

Werken met meerdere parameters

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();
  • Elk datatype heeft zijn eigen setter-methode
Query's uitvoeren op een PostgreSQL-database in Java

Laten we oefenen!

Query's uitvoeren op een PostgreSQL-database in Java

Preparing Video For Download...