Utilizarea instrucțiunilor pregătite

Interogarea unei baze de date PostgreSQL în Java

Miller Trujillo

Staff Software Engineer

Problema cu instrucțiunile simple

String query = "SELECT * FROM books WHERE title = '" + title + "'";
stmt.executeQuery(query);
  • Injecția SQL apare când datele introduse sunt incluse direct în SQL
String title = "' OR 1 = 1 --";
  • Atacatorii pot modifica logica interogării
String query = "SELECT * FROM books WHERE title = '' OR 1 = 1 --'";

$$

  • Injecția SQL poate modifica datele noastre 🚫
Interogarea unei baze de date PostgreSQL în Java

Injecție 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"
  • Toate înregistrările vor fi șterse 🔄

$$

  • Limitarea permisiunilor ajută, dar nu este suficient
  • Atacatorii pot în continuare interoga date sensibile
Interogarea unei baze de date PostgreSQL în Java

Instrucțiuni pregătite

  • Instrucțiune SQL precompilată care folosește substituenți
String sql = "SELECT * FROM books WHERE title = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);

pstmt.setString(1, "Alice in Wonderland");
ResultSet rs = pstmt.executeQuery();
  • Parametrii sunt escapați și tratați ca date, niciodată ca SQL executabil 🔒
Interogarea unei baze de date PostgreSQL în Java

Lucrul cu mai mulți 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();
  • Fiecare tip de date are propriul său metod setter
Interogarea unei baze de date PostgreSQL în Java

Să exersăm!

Interogarea unei baze de date PostgreSQL în Java

Preparing Video For Download...