Uso delle istruzioni preparate

Eseguire query su un database PostgreSQL in Java

Miller Trujillo

Staff Software Engineer

Il problema con le istruzioni

String query = "SELECT * FROM books WHERE title = '" + title + "'";
stmt.executeQuery(query);
  • L'iniezione SQL avviene quando l'input utente è inserito direttamente nel SQL
String title = "' OR 1 = 1 --";
  • Gli attaccanti possono cambiare la logica della query
String query = "SELECT * FROM books WHERE title = '' OR 1 = 1 --'";

$$

  • L'iniezione SQL può modificare i nostri dati 🚫
Eseguire query su un database PostgreSQL in Java

Iniezione 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"
  • Tutti i record saranno eliminati 🔄

$$

  • Limitare i permessi aiuta, ma non basta
  • Gli attaccanti possono ancora accedere a dati sensibili
Eseguire query su un database PostgreSQL in Java

Istruzioni preparate

  • Istruzione SQL precompilata che usa segnaposto
String sql = "SELECT * FROM books WHERE title = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);

pstmt.setString(1, "Alice in Wonderland");
ResultSet rs = pstmt.executeQuery();
  • I parametri sono trattati come dati, mai come SQL eseguibile 🔒
Eseguire query su un database PostgreSQL in Java

Lavorare con più parametri

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();
  • Ogni tipo di dato ha il suo metodo setter
Eseguire query su un database PostgreSQL in Java

Ayo berlatih!

Eseguire query su un database PostgreSQL in Java

Preparing Video For Download...